寻找素数执行的程序需要一些时间

时间:2014-10-08 04:53:11

标签: c performance primes

我写了一个C程序来打印给定范围内的素数以进行锻炼。 这是代码:

#include <stdio.h>
#include <stdbool.h>

int main (void) {
int num1,int num2;
bool flag;
int i,j,count=0;

printf("Enter range 1:");scanf("%d",&num1);
printf("Enter range 2:");scanf("%d",&num2);

if(num1<2)
    num1++;

for(i=num1;i<=num2;i++){
    j=2;
    while(j<i){
        if(i%j==0){
            flag=false;
            break;
        }
        else{
            flag=true;
        }
        j++;
    }
    if(flag){
        printf("%d ",i);
        count++;
    }
}
printf("\n");
printf("Number of prime number between %d and %d is %d\n",
                                            num1,num2,count);
return 0;
}

代码按照我的预期工作,但当我输入1-100000或更大的范围时,程序打印输出就像无限循环一样,我必须等待一段时间才能打印程序打印所有素数。

我的问题是为什么程序需要一些时间来打印1-100000或更大范围内的所有素数?

3 个答案:

答案 0 :(得分:3)

一些小改进:

  • 跳过除2以外的所有偶数。
  • 条件j<i不是必需的,直到i的平方根为止 够了。

然而,对于大数字来说仍然不快,因为算法很慢。考虑一种有效的算法来查找素数,例如:Sieve of Eratosthenes

答案 1 :(得分:2)

以下代码将为您提供更高的效率。您的代码中有许多不必要的检查。

   for(i=num1;i<=num2;i++)
   {   
      flag = 0;
      for(j=2;j<=(i/2);j++)
      {   
         if(i%j == 0)
         {   
            flag = 1;
            break;
         }   
      }   
      if(!flag)
      {   
         printf("%d ",i);
         count++;
      }   
   }

答案 2 :(得分:1)

  

为什么程序需要一些时间

  1. 因为所有程序都需要一些时间(而且这段时间通常取决于程序使用的算法的效率)。
  2. 您使用非常低效的算法来确定数字是否为素数
  3. 你应该研究计算复杂性(big-O表示法),看看你的程序执行了多少次操作( lot )。