素数算法
问题内容:
谁能告诉我如何在C语言中实现Eratosthenes算法的筛选?我需要生成质数,但是我的算法很慢。
我的代码:
#include <stdio.h>
int prime(long int i)
{
long int j;
int state = 1;
for(j=2;j<i;j++)
{
if((i%j)==0){state=0;break;}
}
return state;
}
int main()
{
int t;
long int m,n,i;
scanf("%d", &t);
while(t--) {
scanf("%d %d", &m,&n);
for(i=m;i<=n;i++)
{
if(i==1){
//do nothing for 1
} else{
if(prime(i))printf("%d\n",i);
}
}
}
return 0;
}
t
是测试用例的数量m,n是要打印素数的范围。
问题答案:
您需要创建一个布尔数组,该数组与要查找的最大素数一样大。在开始时,它已完全初始化为true。
i
如果i
是素数,则此数组的th单元将为true ,否则为false。
从i=2
:质数开始迭代,然后将索引倍数为2的任何单元格设置为false。转到下一个质数(i=3
)并执行相同的操作。转到下一个素数(它是i=5
:i=4
不是素数:array[4]
在处理时设置为false
i=2
),然后一次又一次地执行相同操作。