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

C語言判斷素數演算法:為什麼只需檢查到 sqrt(i) 即可?

     編輯:程式設計綜合問答

素數判斷的核心優化原理

在 C 語言中判斷一個整數 i 是否為素數時,初學者常會寫成 for(j=2; j,但這樣的時間複雜度是 O(n)。實際上,我們只需要檢查到 sqrt(i) 即可,大幅降低計算量。

為什麼 j <= sqrt((double)i) 就足夠?

假設 i = a × b,其中 a ≤ b,那麼 a ≤ √i ≤ b。若 i 有因數,必定存在一個因數 ≤ √i。因此,若在 2 到 √i 之間找不到任何因數,i 必為素數。

程式碼範例解析

for (j = 2; j <= sqrt((double)i); j++) {
    if (i % j == 0) y = 0; // 發現因數,非素數
}

(double) 強制轉型是為了讓 sqrt() 接收浮點數參數,避免整數除法導致精度損失。這裡的 y 作為旗標,初始為 1(假設為素數),一旦發現能整除即設為 0。

效能比較

以判斷 10,000 以內的素數為例:

  • j < i:約需 5,000 萬次迴圈
  • j <= sqrt(i):僅需約 60 萬次迴圈

效能提升超過 80 倍,這在大規模素數篩選中極為關鍵。

延伸應用:哥德巴赫猜測驗證

原始程式碼進一步應用此演算法,嘗試將偶數 a 分解為兩個素數之和(i + d = a),同樣利用 sqrt 優化雙重素數檢測。

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