题目
题目描述
给定一个整数 N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。
输入格式
一个整数 N。
输出格式
一个整数,表示反转后的新数。
样例 #1
样例输入 #1
123
样例输出 #1
321
样例 #2
样例输入 #2
-380
样例输出 #2
-83
提示
【数据范围】
-1,000,000,000 < N< 1,000,000,000 。
解法1
这道题,用"/ 和 %"来解;
有一个"坑"是n = 0; 的时候程序会进入"while"的死循环,所以我们一开始先判断n是否为0,为0就直接输出0,然后"return 0; " 结束程序;
程序要求"反转" -1,000,000,000 < N< 1,000,000,000 的数,所以我们设置一个容量为10位的数组存储各个位的数;
先用一个"for"循环来把这些数的每一位提取出来,注意!我们用"s[i] = n / a % 10 "实际上已经把最后一位放在s[0]的位置;
然后将a设为1000000000,是为了让数的每一位都能保存下来,因为我们也不知道要保存多少位数;
接着再用一个"for"循环来将数组s最前面的数加到第一位,接着"a / 10"来加到第二位,以此类推;
最后用一个"while"来去除多余的0;
代码实现
#include<iostream>
int main()
{
using namespace std;
long long n, s[10], a = 1, k = 0;
cin >> n;
if (n == 0) // 解决当 "n = 0;" 的特殊情况
{
cout << n;
return 0;
}
for (int i = 0; i < 10; i++)
s[i] = n / a % 10, a *= 10; // 开始翻转数
a = 1000000000;
for (int i = 0; i < 10; i++)
k += s[i] * a, a /= 10; // 将翻转的数加成一个整数
while (k % 10 == 0)
k /= 10; // 将整数多余的0去掉
cout << k;
return 0;
}
解法2
解法2是解法1的升级,它将一个需要反转的数的最后一位提取出来,然后赋值给sum,然后sum*10,这样又给下一位提供了一个数位,而已经被提取的位,就被" / "舍弃掉;
相当于:
sum --------- n
0 ---------- 123 0 + 123 % 10 123 /= 10
3 ---------- 12 3 + 12 % 10 12 /= 10
32 ---------- 1 32 + 1 % 10 1 /= 10
321 ---------- 0 321
代码实现
#include<iostream>
int main()
{
using namespace std;
int n, sum = 0;
cin >> n;
while (n)
sum = sum * 10 + n % 10, n /= 10;
cout << sum;
return 0;
}
收获
这道题巧妙的用到了"/ 和 %",前面我们也遇到了相似的一道题,感兴趣的可以看一下
https://blog.csdn.net/2301_80147864/article/details/143822087?spm=1001.2014.3001.5501
tips:
最后感谢您能看到这里,如果可以的话能不能给我一个点赞加关注,我会每天分享自己的解题思路,您的认可是我继续创作的最大动力!
标签:10,123,洛谷,NOIP2011,反转,sum,样例,P1307,000 From: https://blog.csdn.net/2301_80147864/article/details/143925068