6 条题解

  • 12
    @ 2022-9-21 22:20:09

    气死我了!!!写了20分钟150多行手滑全没了!!! 网站为啥没有一个防手滑、熊孩子功能!!!确认一下要不要关!!! 😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡 打了5行怒解了个压……

    看在我好不容易又重写了个份上给个好评吧!

    ACAC CodeCode 俩都出来了再给个好评吧!

    题解

    思路1

    1. 输入一个数,如果是负数提前输出-,然后改成正数
    2. 然后循环,如果尾位为0(是10的倍数),那么除以10,直到没有尾位0
    3. 最后倒序输出

    第一步非常简单

    scanf("%d", &N);
    if (N < 0) // 为负数
    {
        printf("-"); // 提前输出
        N = -N; // 变为整数,也可以在特判外加一个 N = abs(N)
    }
    

    第二步

    while (N % 10 == 0) // 如果尾位为0
    {
        N /= 10; // 除以10
    }
    

    第三步才是核心,前面都是简化问题完成题目额外要求,这才是关键,到底要如何倒序输出,或者说倒序地对整数来一遍循环。 想一想我们int转string的时候,循环每一次的 %10\% 10 都是倒过来,从末位开始的,我们当时还让char从前面接入string。

    while (a > 0)
    {
        b = char(a % 10 + '0') + b; // 这里是从前面加入,因为先出来的是末位
        a /= 10;
    }
    

    这样我们就可以倒序输出了

    while (N > 0)
    {
        printf("%c", (N % 10 + '0')); // 这里我们不用从前面加入string,直接输出就成了倒序
        N /= 10;
    }
    

    那么我们把它拼起来:

    #include <bits/stdc++.h>
    using namespace std;
    int N;
    int main()
    {
        // 第一步
        scanf("%d", &N);
        if (N < 0)
        {
            printf("-");
            N = -N;
        }
        // 第二步
        while (N % 10 == 0)
        {
            N /= 10;
        }
        // 第三步
        while (N > 0)
        {
            printf("%c", (N % 10 + '0'));
            N /= 10;
        }
        return 0;
    }
    

    我们会发现,当 N=0N = 0 时,第二步会陷入无限循环,这是因为 00 % 10 == 0 一直成立但是 0/10=00 / 10 = 0。 我们可以在第二步之前添加一个特判 N=0N = 0,此时直接输出0然后结束程序即可。

    #include <bits/stdc++.h>
    using namespace std;
    int N;
    int main()
    {
        // 第一步 输入、转正数
        scanf("%d", &N);
        if (N < 0)
        {
            printf("-");
            N = -N;
        }
        // 特判 N = 0
        if (N == 0)
        {
            printf("0\n"); // 直接输出
            return 0;
        }
        // 第二步 去除末尾0
        while (N % 10 == 0)
        {
            N /= 10;
        }
        // 第三步 倒序输出
        while (N > 0)
        {
            printf("%c", (N % 10 + '0'));
            N /= 10;
        }
        return 0;
    }
    

    思路2

    如果我想不起来怎么倒序输出整数怎么办?用什么倒序输出最方便,string啊!那我们就用string存储吧。

    1. 两种方法:输入string,如果第一位为负号就输出-然后去除它;输入一个字符和一个string,如果字符是负号,就输出-,如果不是那么加到string前面
    2. 判断string最后一位是否为0,为0就去除
    3. 倒序输出string

    第一步第一种方法

    cin >> N; // scanf不能读string
    if (N[0] == '-') // 第一位为0
    {
        printf("-"); // 直接输出
        N = N.substr(1, N.length()); // substr就是取子串,这句话就是去除第一个字符。
    }
    

    但是substr是 O(n)O(n) 的,所以不太推荐,而第二种:

    cin >> ch >> N; // 由于scanf读不了string读char BUG,就用了cin
    if (ch == '-') // 如果是负号
    {
        printf("-"); // 输出即可
    }
    else // 说明我们错读了数字的第一个字符,那么添加到string前面
    {
        N = ch + N;
    }
    

    虽然难理解一些,但是比第一种会更快一点。

    第二步

    while (N[N.length() - 1] == '0') N = N.substr(0, N.length() - 1); // 这里是去除最后一位
    

    这种方法很简单,但是执行了很多次substr,到了平方级,这显然不是我们想要的,我们可以通过 pp 来记录0的交界线,一次substr搞定。

    p = N.length() - 1; // 最开始是最后一位
    while (N[p] == '0') p--; // 每次p前挪一位
    N = N.substr(0, p + 1);
    

    可是这时就有人站出来说:你不是说思路1中 N=0N = 0 会无限循环吗?那这里呢? 这里并不是没有问题,虽然不会无限循环,但是减完最后一个0,pp 会越界,pp 必须 p>=0p >= 0

    p = N.length() - 1;
    while (p >= 1 && N[p] == '0') p--;
    N = N.substr(0, p + 1);
    

    那这里为什么是 p>=1p >= 1 呢?因为如果 N=0N = 0 时,p>=1p >= 1 可以无论如何保住一位,我们就不用写特判了,而且经过简单的证明,不会出现去除第一位的情况。

    最后拼接起来:

    #include <bits/stdc++.h>
    using namespace std;
    int p;
    char ch;
    string N;
    int main()
    {
        // 第一步
        cin >> ch >> N; // 由于scanf读不了string读char BUG,就用了cin
        if (ch == '-') // 如果是负号
        {
            printf("-"); // 输出即可
        }
        else // 说明我们错读了数字的第一个字符,那么添加到string前面
        {
            N = ch + N;
        }
        // 第二步
        p = N.length() - 1;
        while (p >= 1 && N[p] == '0') p--;
        N = N.substr(0, p + 1);
        // 第三步
        for (int i = N.length() - 1; i >= 0; i--)
        {
            printf("%c", N[i]);
        }
        return 0;
    }
    

    ACAC CodeCode 11

    #include <bits/stdc++.h>
    using namespace std;
    int N;
    int main()
    {
        scanf("%d", &N);
        if (N < 0)
        {
            printf("-");
            N = -N;
        }
        if (N == 0)
        {
            printf("0\n");
            return 0;
        }
        while (N % 10 == 0)
        {
            N /= 10;
        }
        while (N > 0)
        {
            printf("%c", (N % 10 + '0'));
            N /= 10;
        }
        return 0;
    }
    

    ACAC CodeCode 22

    #include <bits/stdc++.h>
    using namespace std;
    int p;
    char ch;
    string N;
    int main()
    {
        cin >> ch >> N;
        if (ch == '-')
        {
            printf("-");
        }
        else
        {
            N = ch + N;
        }
        p = N.length() - 1;
        while (p >= 1 && N[p] == '0') p--;
        N = N.substr(0, p + 1);
        for (int i = N.length() - 1; i >= 0; i--)
        {
            printf("%c", N[i]);
        }
        return 0;
    }
    
    • @ 2023-6-8 21:12:34

      下次代码没了就点Ctrl + Z(撤销)

  • 2
    @ 2022-9-4 9:31:59

    这题就是一个个把输入的数末位输出然后把末位删除。

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
    	bool f = 1;//用来判断末位是否是0。
    	int a;
    	cin >> a;
    	if (a < 0)  cout << '-';//这里特判一下负数先输出负号。
    	a = abs(a);//这里把负数取绝对值为正数。
    	while (a > 0)//一位一位取末位。
    	{
    		if (f == 1 and a % 10 == 0)//特判末位是否是0(f是1就表示末位目前还是0)。
    		{
    			a /= 10;//是0就删掉末位,并跳过。
    			continue;
    		}
    		f = 0;//如果运行到这就证明末位已经不是0了,就可以把f设为0了。
    		cout << a % 10;//输出末位。
    		a /= 10;//删除末位。
    	}
    }
    

    放心研究,已AC。 给个好评吧。

    • 1
      @ 2023-9-25 20:19:38
      #include <bits/stdc++.h>
      using namespace std;
      int main()
      {
          int n;
          cin>>n;
          if(n<0) cout<<'-';//复数
          n=abs(n);
          while(n%10==0) n/=10;//去掉末尾的零
          while(n>0){cout<<n%10;n/=10;}//倒序输出
          return 0;
      }
      
      • 1
        @ 2023-9-9 18:14:23

        超简单的好吧

        #include <bits/stdc++.h>
        using namespace std;
        int main(){
        	int n,s=0;
        	cin>>n;
        	while(n!=0){
        		s=s*10+n%10;
        		n=n/10;
        	}
        	cout<<s;
        	return 0;
        }
        
        • 0
          @ 2022-10-12 21:12:12

          我的很容易理解:

          #include <bits/stdc++.h>
          using namespace std;
          //定义
          long long a,sum;
          int main()
          {
          //freopen("reverse.in","r",stdin);
          //freopen("reverse.out","w",stdout);
          //输入
          cin>>a;
          if(a<0)
          {
          cout<<"-";//注意这里要判断
          a=a-a-a;//将 a 转为正整数
          }
          while(a>0)//将 a 的倒数给 sum
          {
          int t=a%10;
          sum=sum*10+t;//这一步是将 sum 一步一步增大,不懂的人可以多模拟模拟
          a/=10;
          }
          cout<<sum;//输出
          //fclose(stdin);
          //fclose(stdout);
          return 0;
          }
          

          放心研究,AC了。 给个好评吧!谢谢!

          • -1
            @ 2022-9-27 17:53:47

            这题用char数组,首先判断是不是负数,然后进行翻转,对翻转前面的'0'去掉即可。

            #include <bits/stdc++.h>
            using namespace std;
            char c[25];
            bool f_0 = true; // 判断目前有没有在开头遇见非'0'数
            int main()
            {
            	scanf("%s", c);
            	if (c[0] == '0')
            	{
            	    printf("0"); // '0'倒过来还是'0'
            	    return 0;
            	}
            	if (c[0] == '-') // 说明输入是负数,所以输出也是负数
            		printf("-");
            	for (int i = strlen(c) - 1; i >= 0; i--)
            	{
            		if (c[i] == '0' && f_0 == true) // 如果是'0'则不打印
            			continue;
            		else if (c[i] >= '0' && c[i] <= '9') // 打印数字
            		{
            			printf("%c", c[i]);
            			f_0 = false; // 说明已经遇到非'0'数字
            		}
            	}
            	return 0;
            }
            
            • 1

            [入门][NOIP2011 普及组] 数字反转

            信息

            ID
            1547
            时间
            1000ms
            内存
            256MiB
            难度
            5
            标签
            递交数
            988
            已通过
            355
            上传者