筛法求素数优化

之前在一篇博客http://blog.csdn.net/once_hnu/article/details/6302283看到了一个筛法求素数优化的程序,于是好奇写了一下思路,留着以后看什么题用用。都在注释里面

#define Max 1000000  
bool prime[Max];  
void IsPrime(){  
     prime[0]=prime[1]=0;prime[2]=1;  
     for(int i=3;i<max;i++)  
        prime[i]=i%2;  
     int t=(int)sqrt(Max*1.0);  
     for(int i=3;i<=t;i++)  
       if(prime[i])  
         for(int j=i*i;j<Max;j+=2*i)
            prime[j]=0;  
//也可以顺便加一个记录素数的数组 
/*筛法求素数的原理是什么呢?
在第一个for循环把所有的偶数都筛掉了,那么在第二个for循环开始筛的时候,之所以从i*i开始,是因为i在这
一定是一个奇数,i*(i-1)中的i-1肯定是一个偶数在之前被筛掉了,然后i*(i-2)在之前筛i-2的时候就已经筛掉了,
所以就可以从i*i开始筛。
同时,每次j+2*i,是因为i,j是奇数,j+奇数倍i是一个偶数在之前被筛掉了,所以就可以只筛偶数倍的i。
但是这种办法会筛一个数多次,那么怎么优化呢?*/
第二个还没看懂...先放其他的

这个也许是只筛一次的

void Prime() { 
memset(a, 0, n*sizeof(a[0])); 
int num = 0, i, j; 
p[num++]=2;a[2*2]=1; 
for(i = 3; i < n; i+=2) { 
if(!(a[i])) p[num++] = i;//i是素数就标记 
for(j = 0; (j<num && i*p[j]<n); ++j) { 
a[i*p[j]] = 1; 
if(!(i%p[j])) break;//i是合数则跳出 
} 
} 
} 
我们用a数组来记录i的最小质因数,那么就可以直接因式分解了.
void Prime2() {
    memset(a, 0, n*sizeof(a[0]));
    int num = 0, i, j;
    for(i = 2; i < n; ++i) {
        if(!(a[i])) p[num++] = i;
        for(j = 0; (j<num && i*p[j]<n && (p[j]<=a[i]||a[i]==0)); ++j) {
            a[i*p[j]] = p[j];
        }
    }
}





猜你喜欢

转载自blog.csdn.net/yslcl12345/article/details/51001433