6 条题解
-
12
气死我了!!!写了20分钟150多行手滑全没了!!! 网站为啥没有一个防手滑、熊孩子功能!!!确认一下要不要关!!! 😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡😡 打了5行怒解了个压……
看在我好不容易又重写了个份上给个好评吧!
俩都出来了再给个好评吧!
题解
思路1
- 输入一个数,如果是负数提前输出
-
,然后改成正数 - 然后循环,如果尾位为0(是10的倍数),那么除以10,直到没有尾位0
- 最后倒序输出
第一步非常简单
scanf("%d", &N); if (N < 0) // 为负数 { printf("-"); // 提前输出 N = -N; // 变为整数,也可以在特判外加一个 N = abs(N) }
第二步
while (N % 10 == 0) // 如果尾位为0 { N /= 10; // 除以10 }
第三步才是核心,前面都是简化问题完成题目额外要求,这才是关键,到底要如何倒序输出,或者说倒序地对整数来一遍循环。 想一想我们int转string的时候,循环每一次的 都是倒过来,从末位开始的,我们当时还让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; }
我们会发现,当 时,第二步会陷入无限循环,这是因为 一直成立但是 。 我们可以在第二步之前添加一个特判 ,此时直接输出
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存储吧。
- 两种方法:输入string,如果第一位为负号就输出
-
然后去除它;输入一个字符和一个string,如果字符是负号,就输出-
,如果不是那么加到string前面 - 判断string最后一位是否为0,为0就去除
- 倒序输出string
第一步第一种方法
cin >> N; // scanf不能读string if (N[0] == '-') // 第一位为0 { printf("-"); // 直接输出 N = N.substr(1, N.length()); // substr就是取子串,这句话就是去除第一个字符。 }
但是substr是 的,所以不太推荐,而第二种:
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,到了平方级,这显然不是我们想要的,我们可以通过 来记录
0
的交界线,一次substr搞定。p = N.length() - 1; // 最开始是最后一位 while (N[p] == '0') p--; // 每次p前挪一位 N = N.substr(0, p + 1);
可是这时就有人站出来说:你不是说思路1中 会无限循环吗?那这里呢? 这里并不是没有问题,虽然不会无限循环,但是减完最后一个0, 会越界, 必须 。
p = N.length() - 1; while (p >= 1 && N[p] == '0') p--; N = N.substr(0, p + 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; }
#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; }
#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; }
- 输入一个数,如果是负数提前输出
-
2
这题就是一个个把输入的数末位输出然后把末位删除。
#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。 给个好评吧。
-
0
我的很容易理解:
#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
这题用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
信息
- ID
- 1547
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 988
- 已通过
- 355
- 上传者