SPOJ上的时间超出错误

时间:2014-07-11 12:38:23

标签: c algorithm

彼得想为他的密码系统生成一些prime numbers。帮助他! 您的任务是生成两个给定数字之间的所有素数!

输入

输入以单行(t<=10)中的测试用例数t开头。在接下来的每一行中,有两个数字m and n (1 <= m <= n <= 1000000000, n-m<=100000)由空格分隔。

输出

对于每个测试用例,打印所有素数p,使m <= p <= n,每行一个数字,用空行分隔的测试用例。

这是链接http://www.spoj.com/problems/PRIME1/

我想出了这个解决方案,但它的显示时间超出了错误,所以我该如何改进呢?

 #include<stdio.h>
 int main()
    {
      int n,a,i,b;
      scanf("%d",&i); 
      while(i>0){
        scanf("%d",&a);
        scanf("%d",&b);
        while(a<=b){    
            for(n=2;n<=a;n++){
            if(a%n==0)break;
            }
            if(a==n){
            printf("%d\n",a);
            }
        a++;
        }
    i--;
    printf("\n");
}
return 0;   
}

2 个答案:

答案 0 :(得分:0)

您需要应用sieve of Eratosthenes来解决给定时间限制内的问题。检查每个数字是否是逐个素数将太慢。

编辑:实际上筛应该是分段的,而不是完整的eratosthenes筛。

答案 1 :(得分:0)

计算素数的最简单快捷方法是使用Erastothenes筛。算法是:

1)Create a list of consecutive integers from 2 through n: (2, 3, 4, ..., n).
2)Initially, let p equal 2, the first prime number.
3)Starting from p, enumerate its multiples by counting to n in increments of p, and mark them in the list (these will be 2p, 3p, 4p, etc.; the p itself should not be marked).
4)Find the first number greater than p in the list that is not marked. If there was no such number, stop. Otherwise, let p now equal this new number (which is the next prime), and repeat from step 3.

对于此问题,您需要使用Segmented Sieve of Erastothenes。请查看链接以获取详细信息。

来自wikipedia(Sieve of Erastothenes)的SoE算法。