首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言哥德巴赫猜測驗證:goto 濫用導致無限迴圈,重構為結構化雙重迴圈

     編輯:程式設計綜合問答

原代碼問題

  • 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) 試除法單次查詢足夠;大量查詢用篩法預處理。代碼簡潔、正確、可維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved