彼得想为他的密码系统生成一些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;
}
答案 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算法。