我的程序在我的编译器中运行良好,但它显示在线竞赛编译器的时间限制超出
第一行输入将包含N =测试用例数。接下来的N行将包含数字n作为测试用例,其中0 <= n <= 1000000000
这是我的代码。
#include<stdio.h>
void main()
{
long t,n,i;
int f = 0;
scanf("%lu",&t);
while(t--)
{
scanf("%lu",&n);
f=0;
if(n==0 || n==1)
{
printf("NOT PRIME\n");
}
else
{
for(i=2;i<=n/2;i++)
{
if(n%i == 0)
{
printf("NOT PRIME\n");
f =1;
break;
}
}
if(f==0)
{
printf("PRIME\n");
}
}
}
}
如何更快地执行此程序。帮我。提前谢谢。
答案 0 :(得分:6)
您可以迭代到n
的平方根而不是n/2
。您也可以在while循环之前预先计算1000000000平方根范围内的所有素数因子。然后尝试将n除以小于或等于sqrt(n)
的素因子,以检查它是否为素数。
for
循环:
(i = 3; i <= sqrt(n); i += 2) // skip 2 because it's the only even prime
答案 1 :(得分:4)
此外,您只需要测试奇数的素数(两个是唯一偶数素数)。 并通过优化进行编译,例如-O3如果使用gcc。
答案 2 :(得分:-1)
不改变您的算法:
for(i=2;i<=n/2;i++)
可能会更快:
for(i=2, m=n/2; i<=m; ++i)
你只计算一次结束值,并且preincrement没有像后期增量一样计算中间值。
然而,通过适当的编译器优化,这两者都已经完成。 在不查看生成程序集的情况下,很难进行任何积极的优化。