高效生成素数

来源:互联网 发布:公共领域道德缺失知乎 编辑:程序博客网 时间:2024/06/05 07:28
#include <iostream>#include <cmath>#include <ctgmath>#define MAX 100000000int main(){    bool *tagArray = new bool[MAX+1];    for (int i = 1; i <= MAX; ++i) {        if (i % 2 == 1)            tagArray[i] = true;        else            tagArray[i] = false;    }    for (int i = 3; i <= sqrt(MAX); i += 2) {        if (tagArray[i])            for (int j = i + 1; j <= MAX; j += i)                tagArray[j] = false;    }    /*    int count = 0;    for (int i = 3; i <= MAX; i += 2)    {        if (tagArray[i])        {            count++;            std::cout << i << " ";            if (count % 10 == 0)                std::cout << std::endl;        }    }    getchar();    */    std::cout << "finish..." << std::endl;    getchar();    return 0;}

我们用高效的素数筛选法来进行。

素数筛法是这样的:
1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false.
2.然后:
for( i=3; i<=sqrt(n); i+=2 )
{ if(prime[i])
for( j=i+i; j<=n; j+=i ) prime[j]=false;
}
3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。
原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质数的倍数筛掉。

100000000 大概3秒。

0 0
原创粉丝点击