goto 導致控制流混亂,難以追蹤與終止judgement 函數邏輯錯誤:rest = k%i 迴圈條件錯誤,會無限迴圈k 而非 √k遍歷 add1 = 2 到 n-1,若 add1 為素數,檢查 n - add1 是否為素數,是則找到一組解。
#include
#include
#include
// 高效素數判斷:試除至 sqrt(n)
bool isPrime(int n) {
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
int limit = (int)sqrt(n);
for (int i = 3; i <= limit; i += 2) {
if (n % i == 0) return false;
}
return true;
}
int main() {
int n;
printf("請輸入大於 6 的偶數: ");
if (scanf("%d", &n) != 1 || n <= 6 || n % 2 != 0) {
printf("輸入無效\n");
return 1;
}
bool found = false;
for (int a = 2; a <= n / 2; a++) { // 只需遍歷到 n/2,避免重複對稱解
if (isPrime(a) && isPrime(n - a)) {
printf("%d = %d + %d\n", n, a, n - a);
found = true;
// 可 break 只找一組,或繼續找所有組
}
}
if (!found) {
printf("未找到分解 (理論上不應發生)\n");
}
return 0;
}
| 原問題 | 改進 |
|---|---|
| goto 控制流 | 結構化 for 迴圈 + 函數封裝 |
| judgement 邏輯錯誤 | isPrime 正確實現試除法至 sqrt(n) |
| 雙重迴圈重複 | 單層迴圈 a=2..n/2,直接檢查 n-a |
| 無輸入驗證 | 檢查偶數且 > 6 |
| 無輸出控制 | 可選 break 或列印所有解 |
// 預計算 1..MAX_N 素數表
const int MAX_N = 1000000;
bool isPrime[MAX_N + 1];
void sieve() {
fill(begin(isPrime), end(isPrime), true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= MAX_N; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= MAX_N; j += i) isPrime[j] = false;
}
}
}
// 查詢時 O(1) 判斷
哥德巴赫猜測驗證核心是高效素數判斷 + 單層迴圈遍歷。摒棄 goto,採用結構化程式設計:isPrime() 封裝邏輯,主迴圈清晰遍歷。sqrt(n) 試除法單次查詢足夠;大量查詢用篩法預處理。代碼簡潔、正確、可維護。