【发布时间】:2022-10-14 14:46:53
【问题描述】:
我想知道我制作的这段代码是否效率低下,或者是否有更快的方法来查找素数。
#include <stdio.h>
int main(void)
{
int count;
for(int i=3; i<1000; i+=2){//search number in range of 3~999
count=0;//init count
for(int j=3; j*j<=i; j+=2){
if(count==1){//if i has aliquot already, break the loop
break;
}
if(i%j==0){
count=1;//if i has aliquot, change count to 1
}
}
if(count==0){
printf("%d ", i);//if there are no aliquot, print i
}
}
return 0;
}
【问题讨论】:
-
我认为这是找到素数的最糟糕的方法之一。对于一些简单的事情,最好从实现埃拉托色尼筛或一个米勒·拉宾初试。
-
每个小于 1000 的素数都可以通过仅查看 <32 的因数来找到,即最多 sqrt(1000)。
-
here 是打印 prims 小于 1000 的最有效方法。
-
从 1 到 4000000000 只有大约 2 亿个素数,并且您使用的是 32 位整数,因此您可以预先计算并在 RAM 延迟时从 LUT 获得结果。
-
仅使用
2作为见证,Miller Rabin 素数测试可以找到小于 1000 的素数。任何高达 MAX_INT 的内容只需要 3 或 4 个见证人 iirc。如果您只需要测试少量数字,这可能是最快的测试。如果您想将它们全部打印出来或测试数百万,那么筛子是最好的。