Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
个人的大体思路:
先判断是整数还是负数,flag记录符号(-1或1),把数字取绝对值然后转换成字符串,字符串逆序,把字符串再转换成数字,再乘以flag添加符号.这样就解决了数字末尾是0,翻转过来0成为开头,还要想办法去掉开头0的问题.代码如下
1 int reverse(int x) { 2 char s[100],c[100]; 3 int flag = 1; 4 //记录符号 5 if (x < 0) { 6 flag = -1; 7 } 8 //取绝对值 9 x = abs(x); 10 //把数字转换成字符串 11 sprintf(s, "%d",x); 12 13 int len = strlen(s); 14 int j = 0; 15 for (int l=len-1; l>=0; l--) { 16 //c字符串++遍历赋值,s字符串--遍历,则c字符串为s字符串的逆序 17 c[j] = s[l]; 18 j++; 19 } 20 //将c字符串转为数字 21 sscanf(c, "%d",&x); 22 //给得到的数字加上符号 23 x *= flag; 24 25 return x; 26 }
结果...当然是Wrong Answer,还好的是有出错的测试数据给你.(详细如下图)
看了测试输入和测试输出,就开始考虑为什么输入1534236469之后应该输出0.上网查了资料,int最大为2147483647,1534236469并没有超出int范围,而且题中也说了给一个integer数,不可能超出了int范围.那应该就是结果超出了int范围.而且一个int值逆序后,是有可能超过int范围的.按照测试数据来看,如果转换结果超过了int范围,输出结果应该为0.
那么既然结果有可能超过int范围,那么,在逆序后的字符串变为数字的时候,就不能用int类型变量接收了,于是我把接收变量变为long型,并且判断,如果超过了int范围,则结果赋值0.代码如下:
1 int reverse(int x) { 2 char s[100],c[100]; 3 int flag = 1; 4 if (x < 0) { 5 flag = -1; 6 } 7 x = abs(x); 8 sprintf(s, "%d",x); 9 10 int len = strlen(s); 11 int j = 0; 12 for (int l=len-1; l>=0; l--) { 13 c[j] = s[l]; 14 j++; 15 } 16 17 long res; 18 19 sscanf(c, "%ld",&res); 20 21 //判断是否超过了int范围 22 if (res > INT32_MAX || res < INT32_MIN) { 23 res = 0; 24 } 25 26 res *= flag; 27 return res; 28 }
运行结果就正确了.
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-15 04:34:25