【发布时间】:2012-06-14 19:41:28
【问题描述】:
我尝试过 Eratosthenes 筛子:以下是我的代码:
void prime_eratos(int N) {
int root = (int)sqrt((double)N);
bool *A = new bool[N + 1];
memset(A, 0, sizeof(bool) * (N + 1));
for (int m = 2; m <= root; m++) {
if (!A[m]) {
printf("%d ",m);
for (int k = m * m; k <= N; k += m)
A[k] = true;
}
}
for (int m = root; m <= N; m++)
if (!A[m])
printf("%d ",m);
delete [] A;
}
int main(){
prime_eratos(179426549);
return 0;
}
花了一些时间:我的系统中真正的 7.340 秒。
我也尝试过阿特金斯筛法(在某处学习的速度比 埃拉托色尼筛)。
但就我而言,这需要时间:真正的 10.433 秒。
代码如下:
int main(){
int limit=179426549;
int x,y,i,n,k,m;
bool *is_prime = new bool[179426550];
memset(is_prime, 0, sizeof(bool) * 179426550);
/*for(i=5;i<=limit;i++){
is_prime[i]=false;
}*/
int N=sqrt(limit);
for(x=1;x<=N;x++){
for(y=1;y<=N;y++){
n=(4*x*x) + (y*y);
if((n<=limit) &&(n%12 == 1 || n%12==5))
is_prime[n]^=true;
n=(3*x*x) + (y*y);
if((n<=limit) && (n%12 == 7))
is_prime[n]^=true;
n=(3*x*x) - (y*y);
if((x>y) && (n<=limit) && (n%12 == 11))
is_prime[n]^=true;
}
}
for(n=5;n<=N;n++){
if(is_prime[n]){
m=n*n;
for(k=m;k<=limit;k+=m)
is_prime[k]=false;
}
}
printf("2 3 ");
for(n=5;n<=limit;n++){
if(is_prime[n])
printf("%d ",n);
}
delete []is_prime;
return 0;
}
现在,我想知道,没有人能够在 1 秒内输出 100 万个素数。
一种方法可能是:
I store the values in Array but the program size is limited.
有人可以建议我用更少的时间获得前 100 万个素数的方法
比满足约束的一秒(上面讨论过)?
谢谢!!
【问题讨论】:
-
即使您不生成它们,您的终端也可能不会在一秒钟内打印 100 万行。
-
可以是概率的吗?
less then a second也依赖于底层硬件,你可以在旧硬件上拥有一个非常好的算法,然后在新硬件上使用一个糟糕的算法。 -
你的意思是
find前100万个素数,因为我认为你不能打印它们,打印缓冲区很小,作为IO需要一些时间。 -
@wobble 我正在输出一个文件...使用时间 ./a.out > eratos.txt
-
绝对不清楚您是否实现了目标,如果实现了,如何实现。您接受的答案中的建议只能给您双倍的加速,但您需要 8 倍。请更新您的问题。是什么为你解决了这个问题,starbolin 建议的块输出?
标签: c++ primes sieve-of-eratosthenes sieve-of-atkin