第一次提交
int reverse(int x)
{
int str[11];
int renumber = 0;
int flags = 0;
//做参数范围判断
if(x > pow(2,31) - 1 || x < -pow(2,31))
{
printf("%d",x);
return 0;
}
//判断x的符号
if(x > 0)
{
flags = 1; //表示x是正数
}
else
{
flags = 0; //0表示负数
}
x = abs(x);
int j = 1;
int i = 0;
int c = 0;
while(x / j !=0)
{
str[i] = x / j - (x / (j * 10)) * 10; //第27行
j = j* 10;
i++;
c++;
}
// for(i=c-1; i>=0; i--)
// {
// if(i!=0)
// printf("%d ",str[i]);
// else printf("%d",str[i]);
// }
j = 1;
for(int i = c-1;i >= 0;i--)
{
renumber = str[i] * j + renumber;
j = j * 10;
}
if(flags)
{
return renumber;
}
else
{
return -renumber;
}
}
错误:
Line 27: Char 34: runtime error: signed integer overflow: 1000000000 * 10 cannot be represented in type 'int' (solution.c)
第二次提交
int reverse(int x)
{
int str[11];
int renumber = 0;
int flags = 0;
//做参数范围判断
if(x > pow(2,31) - 1 || x < -pow(2,31))
{
printf("%d",x);
return 0;
}
//判断x的符号
if(x > 0)
{
flags = 1; //表示x是正数
}
else
{
flags = 0; //0表示负数
}
x = abs(x); //第21行
long j = 1;
int i = 0;
int c = 0;
while(x / j !=0)
{
str[i] = x / j - (x / (j * 10)) * 10;
j = j* 10;
i++;
c++;
}
// for(i=c-1; i>=0; i--)
// {
// if(i!=0)
// printf("%d ",str[i]);
// else printf("%d",str[i]);
// }
j = 1;
for(int i = c-1;i >= 0;i--)
{
renumber = str[i] * j + renumber;
j = j * 10;
}
if(flags)
{
return renumber;
}
else
{
return -renumber;
}
}
错误
Line 21: Char 7: runtime error: negation of -2147483648 cannot be represented in type 'int'; cast to an unsigned type to negate this value to itself (solution.c)
这里错误的原因是,当输入 -2147483648时,使用
x = abs(x);
再次给x赋值时,超出了int类型的最大范围,int类型的最大范围是2147483647
第三次提交:
int reverse(int x)
{
int str[11];
int renumber = 0;
int flags = 0;
//做参数范围判断
// if(x < (-2147483648) || x >(2147483647)) //边界值
// {
// printf("%d",x);
// return 0;
// }
if(x == 0)
{
return 0;
}
//判断x的符号
if(x > 0)
{
flags = 1; //表示x是正数
}
else
{
flags = 0; //0表示负数
printf("flags=%d",flags);
if(x == -2147483648)
{
return 0;
}
}
x = abs(x);
long j = 1;
int i = 0;
int c = 0;
while(x / j !=0)
{
str[i] = x / j - (x / (j * 10)) * 10;
j = j* 10;
i++;
c++;
}
// for(i=c-1; i>=0; i--)
// {
// if(i!=0)
// printf("%d ",str[i]);
// else printf("%d",str[i]);
// }
j = 1;
for(int i = c-1;i >= 0;i--)
{
renumber = str[i] * j + renumber;
j = j * 10;
}
if(flags)
{
return renumber;
}
else
{
return -renumber;
}
}
错误:
Input: 1534236469
Output: 1056389759
Expected: 0
原因:我一开始的想法是将整数转化为字符串,然后将字符串倒转过来,再组成整数即可,但是整数转化为字符串的代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int s[10];
int n,j=1,i=0,c=0;
scanf ("%d",&n);
while(n/j!=0)
{
s[i]=n/j-(n/(j*10))*10;
j=j*10;
i++;
c++;
}
for(i=c-1; i>=0; i--)
{
if(i!=0)
printf("%d ",s[i]);
else printf("%d",s[i]);
}
return 0;
}
仅适用于输入的整数位数小于10位
第四次提交
int reverse(int x)
{
int max = 2147483647;
int min = -2147483648;
if(x == 0)
{
return 0;
}
int result = 0;
while(x != 0)
{
if(result > max / 10 || result < min / 10)
return 0;
result = result * 10 + x % 10;
x = x / 10;
}
return result;
}
反思:
1 在输入部分不需要判断溢出值
if(x < (-2147483648) || x >(2147483647)) //边界值
{
printf("%d",x);
return 0;
}
这段代码是没用必要的,因为x是int类型,所以x值的范围肯定不能大于2147483647或者小于-2147483648。
2 输入的值要判断边界范围,输出的值也要判断范围。
3 整数的翻转和字符串的翻转有相同之处,也有不同之处,整数的翻转可以通过计算进行。
4 这种数值计算题,假如遇到的话,要跟面试官详细讨论边界条件,溢出应该怎么做.
参考资料:
1 https://blog.csdn.net/xuchonghao/article/details/78944586
2https://www.cnblogs.com/yrbbest/p/4430339.html