- admin 的博客
判断回文数
- @ 2025-9-8 18:48:23
我来帮你实现一个判断整数是否为回文数的函数。
方法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(优化版数学方法)是最优选择,因为:
- 时间复杂度:O(log₁₀n),只需要处理数字的一半位数
- 空间复杂度:O(1),只使用了常数级别的额外空间
- 避免溢出风险:不需要处理大数的完全反转
- 效率最高:比其他方法更快
函数返回:
1表示是回文数0表示不是回文数
回文数是指正读反读都一样的数字,例如:121、12321、0 等。