首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言判斷素數:試除法標準實現與優化思路

     編輯:關於C語言

素數定義

大於 1 的自然數,除 1 和它本身外無其他因數。1 不是素數。

試除法核心邏輯

對 n 從 2 試除到 n-1,若存在能整除者則為合數,否則為素數。

標準實現

#include <stdio.h>
#include <stdbool.h>

bool IsPrime(int val) {
    if (val <= 1) return false;  // 1 及負數非素數
    for (int i = 2; i < val; i++) {
        if (val % i == 0) return false;
    }
    return true;
}

int main(void) {
    int data;
    scanf("%d", &data);
    printf(IsPrime(data) ? "yes\n" : "no\n");
    return 0;
}

測試用例

7   → yes
9   → no
13  → yes

優化方向

優化邏輯複雜度
√n 截斷只試除到 sqrt(val),因若 a*b=val 則必有一因子 ≤√nO(√n)
跳過偶數先判 2,再從 3 步長 2 遍歷奇數O(√n/2)
6k±1 模式素數(>3)皆為 6k±1 形式,步長 6 檢查 i 和 i+2O(√n/3)
預篩小素數先用小素數表快速排除明顯合數常數加速

優化版代碼

bool IsPrimeOpt(int val) {
    if (val <= 1) return false;
    if (val <= 3) return true;   // 2, 3
    if (val % 2 == 0 || val % 3 == 0) return false;
    
    for (int i = 5; i * i <= val; i += 6) {
        if (val % i == 0 || val % (i + 2) == 0) return false;
    }
    return true;
}

大數素性測試

32 位整數試除法足夠,64 位或大整數需用 Miller-Rabin 概率測試或 AKS 確定性算法。

總結

試除法是理解素數判斷的入門算法,掌握 √n 截斷與 6k±1 優化可應對絕大多數面試與工程場景。實際項目中推薦使用成熟庫(如 OpenSSL、GMP)的素性測試函數。

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