素数筛法

#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--------------------------------------------------------------------

你可能感兴趣的:(素数筛法)