我可以更快地制作这个C程序吗?

时间:2014-03-22 20:39:41

标签: 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

2 个答案:

答案 0 :(得分:1)

有一些复杂的数学算法,如Sieve of Atkin,可以很快找到素数,但为了您的目的,请考虑:

如果考虑得足够多,那么每个非素数都可以被素数计算。

如果你已经达到了sqrt(n)但仍然没有发现它是可以分解的,那么它就不会是可以因素的,因为任何大于sqrt(n)的数字都必须被考虑在内与小于sqrt(n)的数字一起,以达到您正在寻找的数字。

因此,测试从2到sqrt(n)的每个素数,看看你的n是否是素数。如果2和sqrt(n)之间的素数都不是n的因子,那么n必须是素数。

这应符合作业的速度要求。

答案 1 :(得分:0)

对于这个问题,约束(范围)非常大,所以最好使用Miller–Rabin primality test method


我改变了主意。您可以使用Sieve of Eratosthenes算法。

  

Here是通过Sieve of Eratosthenes方法找到小于或等于给定整数n的所有素数的步骤:

     
      
  • 首先创建一个从2n的连续整数数组:(2, 3, 4, ..., n)。
  •   
  • 让p为整数变量,用2,第一个素数初始化它。
  •   
  • 从p开始,以p为增量进行计数,并将所有p的倍数小于或等于n2p, 3p, 4p .... kp <= n)。
  •   
  • 在未交叉的数组中取第一个大于p的数字。如果没有这样的号码<= n,请停止。否则,在p(这是下一个素数)中分配这个新号码,并从步骤3开始。
  •