如果值是素数还是不更快,我该如何计算?

时间:2014-04-06 03:23:12

标签: c algorithm

我的程序在我的编译器中运行良好,但它显示在线竞赛编译器的时间限制超出 第一行输入将包含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"); 
       }
   }
   }
}

如何更快地执行此程序。帮我。提前谢谢。

3 个答案:

答案 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没有像后期增量一样计算中间值。

然而,通过适当的编译器优化,这两者都已经完成。 在不查看生成程序集的情况下,很难进行任何积极的优化。