今天看到一篇博文,讲的的改进筛素数法,地址如下

http://blog.csdn.net/morewindows/article/details/7347459

其中有一些地方想了很久才明白,写文记载下来。

第一次改进:比如10,我们要访问2*5,也要访问5*2,所以需要改进,我们只需访问5*2即可。

const int MAXN = 100;  
bool flag[MAXN];  
int primes[MAXN / 3], pi;  
void GetPrime_2()  
{  
    int i, j;  
    pi = 0;  
    memset(flag, false, sizeof(flag));  
    for (i = 2; i < MAXN; i++)  
    {  
        if (!flag[i])  
            primes[pi++] = i;  
        for (j = 0; (j < pi)  && (i * primes[j] < MAXN); j++)  
            flag[i * primes[j]] = true;  
    }  
}  

 

第二次改进,比如12,我们要访问4*3,也要访问6*2,还是需要改进,我们选择6*2,因为2是12的最小素因子。但是我们怎么判断一个数要不要访问呢?比如4*3,由于4=2*2,所以4*3肯定能分解为2*2*3,即变为6*2,那我们就等到6*2的时候再访问。代码如下

const int MAXN = 100;  
bool flag[MAXN];  
int primes[MAXN / 3], pi;  
void GetPrime_2()  
{  
    int i, j;  
    pi = 0;  
    memset(flag, false, sizeof(flag));  
    for (i = 2; i < MAXN; i++)  
    {  
        if (!flag[i])  
            primes[pi++] = i;  
        for (j = 0; (j < pi)  && (i * primes[j] < MAXN); j++)  
        {  
            flag[i * primes[j]] = true;  
            if (i % primes[j] == 0) //这句保证每个非素数只被筛去一次  
                break;  
}  
    }  
}