預處理某一區間內的數是否爲質數的方法——埃氏篩
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 開始掃描這個區間內的所有數,對某個數 而言, 均爲合數,由此可以篩掉所有合數。
-
例如判斷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;
}