回文數:正讀反讀相同的正整數,如 121、12321、4554。
bool isPalindrome(int x) {
if (x < 0) return false; // 負數不是回文
if (x != 0 && x % 10 == 0) return false; // 尾數為0(如10、100)不可能回文
int reversed = 0;
while (x > reversed) { // 只反轉一半
reversed = reversed * 10 + x % 10;
x /= 10;
}
// 奇數位:reversed/10 == x;偶數位:reversed == x
return x == reversed || x == reversed / 10;
}
優勢:無溢出風險(只反轉一半)、無額外空間、速度快。
bool isPalindromeStr(int x) {
if (x < 0) return false;
char buf[20];
sprintf(buf, "%d", x);
int len = strlen(buf);
for (int i = 0, j = len - 1; i < j; i++, j--) {
if (buf[i] != buf[j]) return false;
}
return true;
}
#include
#include
#include
bool isPalindromeNum(int x) { /* 算法一實現 */ }
bool isPalindromeStr(int x) { /* 算法二實現 */ }
int main() {
int test[] = {121, -121, 10, 12321, 123321, 0, 1001};
for (int n : test) {
printf("%d: 數字法=%s, 字符串法=%s\n",
n, isPalindromeNum(n)?"是":"否", isPalindromeStr(n)?"是":"否");
}
return 0;
}
121: 數字法=是, 字符串法=是
-121: 數字法=否, 字符串法=否
10: 數字法=否, 字符串法=否
12321: 數字法=是, 字符串法=是
123321: 數字法=是, 字符串法=是
0: 數字法=是, 字符串法=是
1001: 數字法=是, 字符串法=是