目录

  • C++检查回文数的方法
    • 1. 转换为字符串比较法
    • 2. 数字反转法
    • 3. 双指针数字法(不转换为字符串)
    • 4. 递归方法
    • 性能比较

C++检查回文数的方法

回文数是指正读和反读都相同的数字。以下是几种在C++中检查一个数是否为回文数的方法:

1. 转换为字符串比较法

#include <iostream>
#include <string>
#include <algorithm>

bool isPalindromeString(int num) {
    std::string s = std::to_string(num);
    std::string rev = s;
    std::reverse(rev.begin(), rev.end());
    return s == rev;
}

2. 数字反转法

bool isPalindromeReverse(int num) {
    if (num < 0) return false; // 负数不是回文数
    
    int original = num;
    long reversed = 0; // 使用long防止反转后溢出
    
    while (num > 0) {
        reversed = reversed * 10 + num % 10;
        num /= 10;
    }
    
    return original == reversed;
}

3. 双指针数字法(不转换为字符串)

bool isPalindromeTwoPointer(int num) {
    if (num < 0) return false;
    if (num < 10) return true;
    
    int div = 1;
    while (num / div >= 10) {
        div *= 10;
    }
    
    while (num > 0) {
        int left = num / div;
        int right = num % 10;
        if (left != right) return false;
        
        num = (num % div) / 10;
        div /= 100;
    }
    
    return true;
}

4. 递归方法

#include <cmath>

bool isPalindromeRecursiveHelper(int num, int &div) {
    if (num < 10) return true;
    
    if (!isPalindromeRecursiveHelper(num / 10, div)) return false;
    
    if ((num / div) != (num % 10)) return false;
    
    num %= div;
    div /= 10;
    return true;
}

bool isPalindromeRecursive(int num) {
    if (num < 0) return false;
    
    int div = 1;
    while (num / div >= 10) {
        div *= 10;
    }
    
    return isPalindromeRecursiveHelper(num, div);
}

性能比较

  1. 字符串方法:最简单直观,但需要额外的字符串转换和反转操作,性能不是最优
  2. 数字反转法:效率较高,但需要注意整数溢出问题
  3. 双指针法:不需要额外空间,效率高,适合大数
  4. 递归法:代码简洁但可能有栈溢出风险,不适合极大数

对于大多数情况,数字反转法或双指针法是较好的选择。

更多推荐