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

C 語言經典題解:多項式 n²+n+41 區間質數判定 (埃氏篩優化)

     編輯:關於C

題目:素數的判定

對於表達式 f(n) = n² + n + 41,給定區間 [x, y] (-39 ≤ x ≤ y ≤ 50),判斷該區間所有整數 n 代入後的值是否**全為質數**。輸出 OK 或 Sorry。多組測資,0 0 結束。

數學背景:尤拉多項式

n² + n + 41 是著名的**尤拉質數多項式**,對 n = 0~39 產生 40 個質數。但 n = 40 時 40²+40+41 = 1681 = 41² 為合數。本題範圍含負數與超過 39 的值,需實際判定。

解法一:試除法 (資料量小足夠)

區間長度 ≤ 90 (從 -39 到 50),每個值最大 50²+50+41 = 2591,開根號約 51。試除法極快。

#include 
#include 

// 判斷質數 (n > 1)
int is_prime(int n) {
    if (n <= 1) return 0;
    if (n <= 3) return 1;      // 2, 3
    if (n % 2 == 0 || n % 3 == 0) return 0;
    // 6k ± 1 優化
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) return 0;
    }
    return 1;
}

int main() {
    int x, y;
    while (scanf("%d %d", &x, &y) == 2) {
        if (x == 0 && y == 0) break;

        int ok = 1;
        for (int n = x; n <= y; n++) {
            int val = n * n + n + 41;
            if (!is_prime(val)) { ok = 0; break; }
        }
        printf("%s\n", ok ? "OK" : "Sorry");
    }
    return 0;
}

解法二:預先篩選 (極致效能)

預計算 [-39, 50] 所有值的質數性,查詢 O(1)。

#include 
#include 

#define MIN_N -39
#define MAX_N 50
#define MAX_VAL (MAX_N*MAX_N + MAX_N + 41)  // 2591

int prime[MAX_VAL + 1];

void sieve() {
    for (int i = 0; i <= MAX_VAL; i++) prime[i] = 1;
    prime[0] = prime[1] = 0;
    for (int i = 2; i * i <= MAX_VAL; i++) {
        if (prime[i]) {
            for (int j = i * i; j <= MAX_VAL; j += i) prime[j] = 0;
        }
    }
}

int main() {
    sieve();
    int x, y;
    while (scanf("%d %d", &x, &y) == 2) {
        if (x == 0 && y == 0) break;
        int ok = 1;
        for (int n = x; n <= y; n++) {
            int val = n * n + n + 41;
            if (!prime[val]) { ok = 0; break; }
        }
        printf("%s\n", ok ? "OK" : "Sorry");
    }
    return 0;
}

關鍵細節

細節處理
負數 nn*n 為正,公式正常運算。範圍含負數需正確迴圈 for (n=x; n<=y; n++)
值為 1 或負數is_prime 需處理 n <= 1 回傳 0 (本題最小值 n=-39 → 1481 > 1,無負值)
平方溢位int 32 位足夠 (最大 2591),無溢位風險
輸入結束0 0 不處理,直接 break

測試案例

輸入輸出說明
0 1
0 0
OKn=0→41, n=1→43 皆質數
0 39
0 0
OK尤拉 40 個質數
0 40
0 0
Sorryn=40 為 41² 合數
-39 50
0 0
Sorry全區間含合數
40 40
0 0
Sorry單點測試 n=40

複雜度分析

方法預處理單次查詢空間
試除法 (6k±1)無O((y-x+1) × √val) ≈ 90×50 = 4500 操作O(1)
埃氏篩預計算O(MAX_VAL log log MAX_VAL) ≈ 2591O(y-x+1) ≈ 90 查表O(MAX_VAL) ≈ 2.6KB

兩者在本題規模下皆瞬間完成。篩法適合大量查詢、試除法適合單次/少量查詢。

總結

本題考察:質數判定基礎 (試除法/篩法)、區間遍歷、邊界條件 (負數/0/1)、輸入終止處理。尤拉多項式 n²+n+41 是數論經典教材,理解其在 n=0~39 產生質數、n=40 失效的數學原因 (模 41 同餘),能加深對質數分布的直覺。

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