我试过筛了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。
我也尝试了阿特金斯的筛选(在比某地更快的地方学习) 筛选Eratosthenes)。
但就我而言,需要时间:真正的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万个素数吗
满足约束条件(如上所述)?
Thanx !!
答案 0 :(得分:4)
尝试
int main()
{
std::ifstream primes("Filecontaining1MillionPrimes.txt");
std::cout << primes.rdbuf();
}
答案 1 :(得分:2)
你错误地计算了素数。第百万个素数是15485863,比你建议的要小很多。
您可以通过消除筛子中的偶数来加速您的程序并节省空间。
答案 2 :(得分:0)
我知道检查一个数字是否为素数的最快方法是检查复合性,我已经为RSA实现了http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test,它是概率性的,具有高度成功取决于有多少你运行它的时间。
答案 3 :(得分:-1)
步骤1.不要做printf
步骤2.购买更快的电脑。