我需要制作一个打印所有素数的程序,这就是我所做的:
#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
答案 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。
Here是通过Sieve of Eratosthenes方法找到小于或等于给定整数
n
的所有素数的步骤:
- 首先创建一个从
2
到n
的连续整数数组:(2, 3, 4, ..., n
)。- 让p为整数变量,用2,第一个素数初始化它。
- 从p开始,以p为增量进行计数,并将所有p的倍数小于或等于
n
(2p, 3p, 4p .... kp <= n
)。- 在未交叉的数组中取第一个大于p的数字。如果没有这样的号码
<= n
,请停止。否则,在p
(这是下一个素数)中分配这个新号码,并从步骤3开始。