【发布时间】:2013-09-26 12:14:52
【问题描述】:
我正在尝试打印 2**32 以下的每个质数。现在我正在使用一个布尔向量来构建一个筛子,然后在制作筛子后打印出素数。打印出多达 10 亿个素数需要 4 分钟。有没有更快的方法来做到这一点?这是我的代码
#include <iostream>
#include <cstdlib>
#include <vector>
#include <math.h>
using namespace std;
int main(int argc, char **argv){
long long limit = atoll(argv[1]);
//cin >> limit;
long long sqrtlimit = sqrt(limit);
vector<bool> sieve(limit+1, false);
for(long long n = 4; n <= limit; n += 2)
sieve[n] = true;
for(long long n=3; n <= sqrtlimit; n = n+2){
if(!sieve[n]){
for(long long m = n*n; m<=limit; m=m+(2*n))
sieve[m] = true;
}
}
long long last;
for(long long i=limit; i >= 0; i--){
if(sieve[i] == false){
last = i;
break;
}
}
cout << last << endl;
for(long long i=2;i<=limit;i++)
{
if(!sieve[i])
if(i != last)
cout<<i<<",";
else
cout<<i;
}
cout<<endl;
【问题讨论】:
-
打印出前十亿个素数需要 waaaaay 超过 4 分钟。
-
我认为最快的方法是跳过所有你知道不是素数的数字,例如,以
2、4、5(5 之后)、6结尾的数字,8,0 -
如果需要 4 分钟。对于 10 亿,应该需要 16 分钟。 40 亿美元,与等待 SO 的答案相比,这还不算太糟糕。一旦你计算了它们,你就不需要再次计算它们了。哎呀,只是让他们离开网络并完成它!
-
为了减少存储需求,关于素数或非素数的信息在每个字节中存储了 30 个整数。只需要一位来存储整数的素数或非素数。整数的值由位的位置已知。在每 30 个整数中,对于 N >= 1,可能是素数的数是 N*30+1、N*30+7、N*30+11、N*30+13、N*30+17、N* 30+19, N*30+23, N*30+29 rsok.com/~jrm/printprimes.html
-
这是一场谁可以做最好的谷歌搜索的比赛吗? ;-)
标签: c++ algorithm primes sieve-of-eratosthenes