找出所有不超過 255 的整數 i,使得 i*i 是回文數(正讀反讀相同)。無輸入,直接輸出滿足條件的 i,每行一個。
i ∈ [0, 255],i*i ≤ 65025(5 位數)。直接平方、轉字符串判回文,時間可忽略。
按位數分類:
• 1 位:n < 10 全部回文
• 2 位:n % 10 == n / 10
• 3 位:n % 10 == n / 100
• 4 位:n % 10 == n / 1000 && (n%1000-n%10)/10 % 10 == ((n%1000-n%10)/10)/10
• 5 位:n/10000 == n%10 && (n%10000-n%10)/10 /100 == (n%10000-n%10)/10 %10
bool isPalindrome(int x) {
if (x < 0) return false;
int orig = x, rev = 0;
while (x) { rev = rev * 10 + x % 10; x /= 10; }
return orig == rev;
}
#include <stdio.h>
bool isPal(int n) {
int o = n, r = 0;
while (n) { r = r * 10 + n % 10; n /= 10; }
return o == r;
}
int main() {
for (int i = 0; i < 256; ++i)
if (isPal(i * i))
printf("%d\n", i);
return 0;
}
0 1 2 3 11 22 26 101 111 121 202 212 264
共 14 個數(含 0)。若題目要求正整數,去掉 0 剩 13 個。