我能让这个 C 程序更快吗?

标签 c primes

我需要编写一个程序来打印所有素数,这是我所做的:

#include <stdio.h>

int main(void) {
    long long t,m,n,i,i2,i3,found;
    float p;
    scanf ("%lld" , &t);
    for (i=1;i<=t;i++) {
        scanf ("%lld%lld" , &m ,&n);
        for (i2=m;i2<=n;i2++) {
            found=0;
            for (i3=2;i3<=i2/2;i3++) {
                p=(float)i2/i3;
                p=p-i2/i3;
                if (p==0) {
                    found=1; 
                }
            }
            if ((found==0) && (i2!=1)) {
                printf ("%lld\n" , i2); 
            }
        }
        printf ("\n");
    }
    return 0;
}

我的时间限制是6秒,用这个代码是不可能的,而且m和n之间的差异最大是100000,并且1<=n<=m<=1000000000

最佳答案

有复杂的数学算法,例如 Sieve of Atkin ,可以非常快速地找到素数,但出于您的目的,请考虑:

如果分解得足够远,每个非素数都可以被素数分解。

如果您已经达到 sqrt(n) 但仍未发现它可以分解,那么它就无法分解,因为任何大于 sqrt(n) 的数字都必须与小于 sqrt 的数字一起分解(n) 达到您正在寻找的数字。

因此,测试从 2 到 sqrt(n) 的每个素数,看看您的 n 是否是素数。如果 2 和 sqrt(n) 之间的素数都不是 n 的因数,则 n 一定是素数。

这应该满足您的作业的速度要求。

关于我能让这个 C 程序更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22583275/

相关文章:

c - 带有递归和回溯的骑士​​之旅代码

c - 如何访问用户定义数据类型的数组元素? (C)

algorithm - 和为质数的特殊对

javascript - 如何找到 0 - 100 之间的质数?

java - 面试题: What is the fastest way to generate prime number recursively?

c - 在函数内部使用 realloc

c - 当找到匹配时增加数组的内容

algorithm - 使用一组质数按升序生成整数

Python:列表理解中某处出错了?

c - Select() 使用相同的套接字描述符发送和接收