【发布时间】:2022-01-29 11:01:17
【问题描述】:
所以我正在编写一个程序,它计算所有数字的质数除数高达 200 万。 所以逻辑是所有素数数组索引的值都为 1,所有复合数组索引的值都为 no。的主要除数。例如。 pno[3] = 1 ;pno[4]=1; pno[6]=2 ; pno[9]=1 等等。
void prim(){
long int pno[20000001] = {0}; //initialise all as 0
for(long i=1;i<=2000000;++i){
if(pno[i]==0){ //check if no is prime
for(long j=i;j<=2000000;++j){
if(j%i==0){ //if i(a prime) divides j(a composite) then increase
++pno[j];
}
}
}
}
}
但它没有按预期工作,并且每个值最后都设置为 1。这里有什么问题?
编辑:这个问题已通过 James K polk 的评论解决。我应该从 i=2 开始,而 j 应该增加 i
【问题讨论】:
-
long int pno[20000001] = {0}; //initialise all as 0这很可能会耗尽堆栈内存。然后你有一个嵌套的for循环,它将执行 2000000000000 次。显然,你试图解决这个问题的方式是不对的。 -
你从 1 开始,这是一个错误。首先 1 不是素数,其次每个数字都可以被 1 整除。从 2 开始。j 循环也应该在每次迭代时增加 'i',而不是 1。所以
for(long j=i;j<=2000000;j+=i)。 -
@PresidentJamesK.Polk 哦哦!现在觉得自己好傻。太感谢了。您的评论更正了我的代码。