这篇文章上次修改于 237 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
2025-03-05-判断回文数
回文数是指正序(从左到右)读和倒序(从右到左)读都是一样的整数。
比如形如 121,1221,13531 的数字都是回文数,但 -121,10,25 等等都不是回文数。
取反对比
一种容易想到的方法是:将整个数取反后看和原来的数是否相同。
bool isPalindrome(int x) {  
    if (x<0)  
        return false;  
    long long sum =0;  
    long long origin = x;  
    while(x)  
    {  
        int num = x %10;  
        sum = sum*10 + num;  
        x/=10;  
    }  
    if(sum == origin)  
        return true;  
    else  
        return false;  
}
左右翻转
根据回文数的特点,我们只需要判断左边一半和翻转后的右边一半是否相等即可。
bool isPalindrome(int x) {
    // 负数肯定不是,以及首尾不对称的非0数
    if(x < 0 || (x % 10 == 0 && x != 0))
        return false;
    int rev = 0;
    while ( x > rev){
        rev = rev * 10 + x % 10; //将低位一半的数取反。
        x = int (x / 10);
    }
    //有rev >= x, 奇数情况下需要除去10
    return x == rev || x == int(rev/10); 
}
双指针
在循环体中,不断地比较第 i 位和倒数第 i 位,直到遇到最中间的 1 个数字(输入为奇数个数字)或者遇到最中间的 2 个数字(输入为偶数个数字)时结束。
bool isPalindrome(int x) {  
  if (x < 0) return false;  
  int div = 1;  
  while (x / div >= 10) {  
    div *= 10;  
  }          
  while (x != 0) {  
    int l = x / div;  
    int r = x % 10;  
    if (l != r) return false;  
    x = (x % div) / 10;  //去掉两边的数
    div /= 100;  
  }  
  return true;  
}
补充:一个证明,有偶数位的回文数能被 11 整除
- 考虑偶数位的回文数:假设我们有一个有偶数位的回文数
 ,设其位数为 (其中 是正整数)。我们可以将 表示为: 
其中
。 
- 将回文数表示为数学形式:我们可以将
 写成: 
这可以重写为:
- 提取公因数:注意到每一项
 都可以提取公因数 : 
这可以进一步简化为:
- 分离公因数 11:由于
 ,我们可以看到 可以被11整除。因此, 有一个因子 11。 - 结论:因为
 有因子 11,所以 不是质数,除非 。但是题目中已经排除了 11 的情况。 
因此,有偶数位的回文数(除了 11)必然不是质数。