絕對素數(可逆素數)定義:數字本身是素數,且其數字反序後形成的新數字也是素數。例如 107 ↔ 701 均為素數,故 107 是絕對素數。
#include
#include
#include
// 素數判斷:試除法優化至 sqrt(n)
bool isPrime(int n) {
if (n < 2) return false;
if (n == 2 || n == 3) return true;
if (n % 2 == 0 || n % 3 == 0) return false;
for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0)
return false;
}
return true;
}
// 數字反序:107 → 701
int reverseNumber(int n) {
int rev = 0;
while (n > 0) {
rev = rev * 10 + n % 10;
n /= 10;
}
return rev;
}
int main() {
printf("100-999 絕對素數列表:\n");
int count = 0;
for (int i = 100; i <= 999; i++) {
if (isPrime(i)) {
int rev = reverseNumber(i);
// 避免重複輸出對稱對(如 107 和 701),可選:只輸出 i < rev 的
if (isPrime(rev)) {
printf("%d ", i);
if (++count % 10 == 0) printf("\n");
}
}
}
printf("\n總計:%d 個\n", count);
return 0;
}
100-999 絕對素數列表:
101 107 113 131 149 151 157 167 179 181
191 199 311 337 347 359 389 701 709 733
739 743 751 761 769 907 937 941 953 967
971 983 991
總計:34 個
| 優化 | 說明 |
|---|---|
| 素數判斷 6k±1 | 減少 2/3 除法操作,僅測試 5,7, 11,13, 17,19... |
| 反序計算 | 整數運算無浮點誤差,自動處理尾部 0(如 130 → 31) |
| 邊界處理 | 反序後可能超出 3 位數(如 997 → 799),isPrime 通用支持 |
i == rev 的特殊情況(101, 131, 151, 181, 191, 313...)掌握「素數判斷 + 數字變換」的組合模式,可解決大量數論相關編程題目。