【C++练习】12.C++检查一个数是否为回文数
·
目录
- 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);
}
性能比较
- 字符串方法:最简单直观,但需要额外的字符串转换和反转操作,性能不是最优
- 数字反转法:效率较高,但需要注意整数溢出问题
- 双指针法:不需要额外空间,效率高,适合大数
- 递归法:代码简洁但可能有栈溢出风险,不适合极大数
对于大多数情况,数字反转法或双指针法是较好的选择。
更多推荐


所有评论(0)