埃式篩法——快速篩選n以內的素數
阿新 • • 發佈:2019-02-18
/*
埃氏篩法(快速篩選n以內素數的個數)
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7;
int prime[N];//第i個素數
bool is_prime[N];//true表示i是素數
int Ans(int n){
int i, j, k;
k = 0;
memset(is_prime, true, sizeof(is_prime));
is_prime[0] = is_prime[1] = false;//預處理0和1,0和1不是素數
for(i = 2; i <= n; i++){
if (is_prime[i]){///當前i是一個素數,則他的倍數皆不是素數
prime[k++] = i;//計算素數的個數,同時記錄素數本身
for(j = 2*i; j <= n; j += i){//篩掉素數的倍數的數
is_prime[j] = false;
}
}
}
return k;//返回n以內素數的個數
}
int main(){
int n, i, ans;
while(cin >> n){
ans = Ans(n);
cout << ans << endl;//輸出素數的個數
for(i = 0; i < ans; i++){
cout << prime[i] << endl;//輸出素數本身
}
}
return 0;
}