Posted on 2010-03-12 14:04
rikisand 阅读(1535)
评论(0) 编辑 收藏 引用 所属分类:
C/C++
#include <iostream>
#include <vector>
#include "time.h"
using namespace std;
void sieve(int n){
vector<bool> isprime(n,true);
vector<int> prime;
int cnt=0;
for(int i=2;i<n;i++){
if(isprime[i])cnt++,prime.push_back(i);
for(int t=0;t<cnt&&i*prime[t]<n;t++){
isprime[i*prime[t]]=false;
if(i%prime[t]==0)break;
}
}
/*for(int i=0;i<cnt;i++)
cout<<prime[i]<<" ";*/
}
void oldseive(int n){
vector<bool> isprime(n,true);
vector<int> prime;
for(int i=2;i<n;i++){
if(isprime[i]){
prime.push_back(i);
for(int j=i*2;j<n;j+=i)
isprime[j]=false;
}
}
/*for(int i=0;i<prime.size();i++)
cout<<prime[i]<<" ";*/
}
int main(){
clock_t start,end;
start = clock();
sieve(2000000);
//oldseive(2000000);
end = clock();
double time = double(end-start)/CLOCKS_PER_SEC;
cout<<endl<< time<<endl;
}
线性筛法sieve 1.546s oldsieve 2.875s 快了将近一倍
old sieve 缺陷:合数可能被多次筛掉,例如 30被2,3,5筛掉了3次 然后 线性筛法限定了 任何一个合数只被它的最小质因数筛掉一次,怎么做到这一点~~
if(i%prime[t]==0) break; 如果此时筛掉的合数从小到大找到第一个可以整除的质数,那么显然他找到了它的最小质因数,此时我们停止搜索质数表,因为后面的质数比当前的prime[t]要大,如果我们用prime[t+n]*i 筛掉了一个合数,这个合数必然可以表述成为 prime[t]*someK *prime[t+n] 也就是说这个合数的最小质因数也是prime[t],他应该被 prime[t]筛掉-->当程序运行到 someK*prime[t+n] 的时候~~~~
over--------------------------------------------------------------------