我来帮你实现一个判断整数是否为回文数的函数。

方法1:转换为字符串(简单直观)

#include <string>
#include <algorithm>
using namespace std;

int isPalindromesNumber(int num) {
    // 处理负数(负数不是回文数)
    if (num < 0) return 0;
    
    string str = to_string(num);
    string reversed_str = str;
    reverse(reversed_str.begin(), reversed_str.end());
    
    return str == reversed_str;
}

方法2:数学方法(不使用字符串转换)

int isPalindromesNumber(int num) {
    // 处理特殊情况
    if (num < 0) return 0;          // 负数不是回文数
    if (num < 10) return 1;         // 个位数是回文数
    if (num % 10 == 0) return 0;    // 以0结尾的不是回文数(0本身除外)
    
    int original = num;
    long long reversed = 0;  // 使用long long防止反转后溢出
    
    while (num > 0) {
        reversed = reversed * 10 + num % 10;
        num /= 10;
    }
    
    return original == reversed;
}

方法3:优化版数学方法(只反转一半数字)

int isPalindromesNumber(int num) {
    // 处理特殊情况
    if (num < 0) return 0;
    if (num < 10) return 1;
    if (num % 10 == 0) return 0;
    
    int reversed = 0;
    
    // 当原始数字大于反转后的数字时继续
    while (num > reversed) {
        reversed = reversed * 10 + num % 10;
        num /= 10;
    }
    
    // 数字长度为偶数:num == reversed
    // 数字长度为奇数:num == reversed / 10
    return num == reversed || num == reversed / 10;
}

测试示例

#include <iostream>
using namespace std;

int main() {
    cout << isPalindromesNumber(121) << endl;    // 1 (true)
    cout << isPalindromesNumber(-121) << endl;   // 0 (false)
    cout << isPalindromesNumber(10) << endl;     // 0 (false)
    cout << isPalindromesNumber(0) << endl;      // 1 (true)
    cout << isPalindromesNumber(12321) << endl;  // 1 (true)
    return 0;
}

推荐使用方法3

方法3(优化版数学方法)是最优选择,因为:

  1. 时间复杂度:O(log₁₀n),只需要处理数字的一半位数
  2. 空间复杂度:O(1),只使用了常数级别的额外空间
  3. 避免溢出风险:不需要处理大数的完全反转
  4. 效率最高:比其他方法更快

函数返回:

  • 1 表示是回文数
  • 0 表示不是回文数

回文数是指正读反读都一样的数字,例如:121、12321、0 等。