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

C語言判斷質數(素數)的高效實現與邊界處理

     編輯:關於C

質數定義與判斷邏輯

質數(Prime)是大於 1 的自然數,除 1 和自身外無其他因數。判斷 n 是否為質數:檢查 2 到 √n 是否有因數,有則為合數,否則為質數。

優化實現代碼

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

bool isPrime(unsigned int n) {
    if (n <= 1) return false;      // 0, 1 非質數
    if (n <= 3) return true;       // 2, 3 是質數
    if (n % 2 == 0 || n % 3 == 0) return false;  // 排除 2, 3 的倍數

    // 6k ± 1 優化:所有質數(>3)形式為 6k±1
    for (unsigned int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
    }
    return true;
}

int main() {
    unsigned int n;
    printf("請輸入要判斷的數字: ");
    scanf("%u", &n);
    printf("%s\n", isPrime(n) ? "Prime" : "Not Prime");
    return 0;
}

優化技巧解析

  • 早期篩選: 排除 ≤1、2、3、偶數、3 的倍數。
  • 6k±1 規律: 大於 3 的質數必鄰近 6 的倍數(因 6k, 6k±2, 6k±3, 6k+4 皆可被 2 或 3 整除),迴圈步長 6,每輪檢查 i 和 i+2。
  • 迴圈條件 i*i <= n: 避免 sqrt() 浮點運算與精度問題,整數乘法更快。
  • 型別選用 unsigned int: 擴展正數範圍,語義更清晰。

複雜度與適用範圍

對於 64 位整數或批次大量判斷,建議用 Miller-Rabin 概率測試或埃拉托斯特尼篩法預計算。

常見錯誤避坑

  • 迴圈上界寫 i < sqrt(n) 而非 i*i <= n,邊界易出錯且效能差。
  • 未處理 n <= 1 導致誤判。
  • 使用 int 導致負數輸入邏輯混淆。
  • 針對大數(> 10⁹)仍用試除法,應改用概率演算法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
指標數值
時間複雜度O(√n / 3) ≈ O(√n)
空間複雜度O(1)
適用範圍32 位無號整數(< 42.9 億)即時判斷