题目
C代码
bool isPalindrome(int x){
int re = 0;
int ro = 0;
if (x < 0 || (x != 0 && x % 10 == 0))
return false;
if (x == 0)
return true;
ro = x;
while (ro > 0) {
if (re == ro || (re == (ro/10)))
return true;
if (re > ro)
break;
re = (re * 10) + (ro % 10);
ro /= 10;
}
return false;
}
注意点
- 负数不可能是回文数;
- 个位上含是0的数不可能是回文数;
- 避免判断32位整型整数溢出的循环判断技巧;
避免判断32位整型整数溢出的循环判断技巧
场景
当判断1000000009是否回文数时,如果完整调换各位会得到一个9000000001的数,该数会大于231-1=2147483647,导致溢出情况;
问题
那么有什么办法可以避免这种溢出的冲突吗?
解决方案
考虑到待判断的数是在-231 ~ 231-1的范围内,所以按十进制的位数判断,最大为10位,那么取一半,最多就是5位;那么一个最大的5位数乘以10是不可能达到溢出的效果的
实现
如代码中的if(re>ro) break;
的条件满足退出了循环,避免了re会超过6位数的可能;