// 原代碼意圖:判斷輸入整數是否為回文數
if (reverse == n)
printf("%d is a palindrome", n);
else
printf("%d is not a palindrome", n);
用戶輸入 4,程序輸出 4 is a palindrome,用戶誤以為程序在判斷質數,實則 4 確實是回文數(單位數字皆為回文),邏輯無誤,只是需求理解偏差。
bool isPrime(int n) {
if (n <= 1) return false;
if (n <= 3) return true; // 2, 3 是質數
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;
}
優化點:只檢查 6k±1 形式的因子,時間複雜度 O(√n)。
void printPrimesInRange(int L, int R) {
vector isPrime(R + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= R; ++i) {
if (isPrime[i]) {
for (int j = i * i; j <= R; j += i)
isPrime[j] = false;
}
}
for (int i = max(2, L); i <= R; ++i)
if (isPrime[i]) cout << i << ' ';
}
| 概念 | 定義 | 示例 |
|---|---|---|
| 回文數 | 正讀反讀相同 | 121, 1331, 4, 11 |
| 質數 | 大於 1 且僅能被 1 和自身整除 | 2, 3, 5, 7, 11, 13 |
| 回文質數 | 同時滿足以上兩者 | 2, 3, 5, 7, 11, 101, 131 |
int main() {
for (int i = 100; i <= 200; ++i) {
if (isPalindrome(i) && isPrime(i))
cout << i << endl;
}
return 0;
}
bool isPalindrome(int n) {
int rev = 0, orig = n;
while (n > 0) {
rev = rev * 10 + n % 10;
n /= 10;
}
return rev == orig;
}
輸出:101, 131, 151, 181, 191
void main() → 標準寫法 int main() 並 return 0;using namespace std; 建議具體引用或限制作用域。i < n 效率極低,務必用 i * i <= n。cin/cout,關閉同步加速:ios::sync_with_stdio(false); cin.tie(nullptr);