預處理某一區間內的數是否爲質數的方法——埃氏篩

預處理某一區間內的數是否爲質數的方法——埃氏篩

for (int i = 2; i <= n; ++i) {
    is_prime[i] = 1;
}
for (int i = 2; i <= n; ++i) {
    for (int j = i * 2; j <= n; j += i) {
        is_prime[j] = 0;
    }
}
  • 原理,先假設所有數都是質數;從 2 開始掃描這個區間內的所有數,對某個數 ii 而言,2i,3i,4i...2i,3i,4i... 均爲合數,由此可以篩掉所有合數。

  • 例如判斷2-10000內的質數。

#include <stdio.h>
#include <string.h>

int main (){

    // 初始化數組
    int buf[10001];
    memset(buf, 0, sizeof(buf));	// 全部爲0
    for(int i = 1; i <= 10000; ++i){
        printf("%d ", buf[i]);
    }
    printf("\n");

    // 歐式篩法
    //// 假設2-10000全爲質數
    for(int i = 2; i <= 10000; i++){
        buf[i] = 1;
    }
    //// 篩選所有合數
    for(int i = 2; i <= 10000; i++){
        for(int j = i*2; j <= 10000; j += i){
            buf[j] = 0;
        }
    }
    for(int i = 2; i <= 10000; i++){
        if(buf[i]){
            printf("%d ", i);
        }
    }
    printf("\n");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章