题意理解
将一个整数反转,作为一个整数输出,如果超过int范围,输出为0。
问题分析
算法思路:设整数为x,当x不为0时,x%10取出反转后的第一个数字,x缩小为x/10,输出的反转数等于当前的反转数乘以10加上余数。如果x比MAX_INT/10大时,输出0,如果x等于MAX_INT/10,x%10 >= 8时,输出0;如果x比MIN_INT/10小时,输出0,如果x等于MIN_INT/10,x%10 < -8时,输出0.
int reverse(int x) {
int y = 0;
while(x != 0)
{
int a = x % 10;
if(y > INT_MAX/10 || (y == INT_MAX / 10 && a > 7)) return 0;
if(y < INT_MIN/10 || (y == INT_MIN / 10 && a < -8)) return 0;
y = 10 * y + a;
x = x / 10;
}
return y;
}
其他
MIN_INT,MAX_INT是两个常量,需要记得。
整数反转的算法:记得循环条件是当前数,商赋值作为新的当前数,余数是反转后的数。
链接
int reverse(int x) {
int ans = 0;
while (x % 10 || x / 10) { //商和余数不同是为0
int y = x % 10; //求余数
if ((x>0) && ans > INT_MAX / 10 + (-y) / 10) { //正数,ans*10 + y > INT_MAX,溢出,计算过程中防止溢出,分开求值
return 0;
}
if ((x<0) && ans < INT_MIN / 10 + (-y) / 10) { //负数,ans*10 + y < INT_MIN
return 0;
}
ans = ans * 10 + y;//反向补充
x = x / 10; //求下一位
}
return ans;
}