您的位置:首页 > 其它

快速线性筛法的原理和值得借鉴的方法

2014-11-17 12:13 239 查看
筛法求素数就是先认定所有的数是素数(int a[10000]={0}),再通过一些方法把合数踢掉(a[i']=1)

一般筛法的思想是:从2开始找,素数的倍数(1倍、2倍、3倍,,,)为合数。它的缺点是会重复筛除一些合数 ( 像筛除3*5之后又会筛除5*3,这样会使复杂度很大)

快速线性筛法的特点就是不会重复筛除一个合数。它的原理是

前提是:一个合数 i=p1*p2*...*pn, pi都是素数(2<=i<=n), pi<=pj ( i<=j )

p1是最小的系数。这样每一个合数就有一个确定的表示方法,不会重复。(像12=2*2*3)

No.21:我们现在规定一个合数由两个数得到。

NO.2:那么合数有两种。1.素数*素数=合数 2.一个最小的素数*合数=合数

如果遇到i为素数,那么一个大的素数 i 乘以不大于 i 的素数,这样筛除的数跟之前的是不会重复的

如果遇到i为合数,我们只认为合数由一个最小的素数*合数得到,也不会重复(就像12=2*6而不是12=3*4)

那么代码来了

#include<iostream>  
using namespace std;      
const long N = 200000;     
long prime
 = {0},num_prime = 0;      
int isNotPrime
 = {1, 1};     
int main()      
{       
        for(long i = 2 ; i < N ; i ++)         
        {              
        if(! isNotPrime[i])                 
            prime[num_prime ++]=i;    
        //关键处1          
        for(long j = 0 ; j < num_prime && i * prime[j] <  N ; j ++)  
            {                 
                isNotPrime[i * prime[j]] = 1;    
            if( !(i % prime[j] ) )  //关键处2                    
                break;             
        }          
    }          
    return 0;     
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: