c - 质数算法

标签 c algorithm optimization primes sieve-of-eratosthenes

谁能告诉我如何实现 Sieve of Eratosthenes C中的算法?我需要生成质数,但我的算法很慢。

我的代码:

#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 是测试用例的数量,n 是要打印素数的范围。

最佳答案

您需要创建一个与要查找的最大质数一样大的 bool 数组。一开始它完全初始化为 true。

如果 i 是质数,则此类数组的第 i 单元格为真,否则为假。

i=2 开始迭代:它是素数,然后将索引倍数为 2 的任何单元格设置为 false。转到下一个素数 (i=3 ) 并做同样的事情。转到下一个素数(它是 i=5:i=4 不是素数:array[4] 在处理 时被设置为 false code>i=2) 并一次又一次地做同样的事情。

关于c - 质数算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4809051/

相关文章:

java - 如何为 Dijkstra 算法实现 PriorityQueue?

algorithm - Restful : Using POST to execute algorithms

python - Python中将图片分成矩形信息

java - 我需要一个 Java 求解器库作为 Excel 求解器工具的优化

c - 在缓冲区中找到第一个未设置的位(优化)

c++ - Win32代码异常

c - -1.0/1.0 操作返回 0?

c - 数组初始值设定项必须是初始值设定项列表或字符串文字 c

c - 你如何防止名称在 C 中发生冲突

c++ - 不指定函数参数求值的确切顺序如何帮助 C 和 C++ 编译器生成优化代码?