0

该程序应该显示 1-3000 范围内的素数,但它只显示 743-3000 范围内的素数。如何让它打印范围内的所有素数?

这是程序:

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

main()
{

      unsigned long long num, divisible_num;

      printf("The prime numbers in the range of 1 - 3000 are: \n");
      for(num=1;num<=3000;num++)
       {
             for(divisible_num=2;divisible_num<=sqrt(num);divisible_num++)
             {     
                 if(num%divisible_num==0)
                    break;
             }
                 if(num%divisible_num!=0)
                 {
                 printf("%lu\n", num);
                 }
       }
      getchar();
}
4

2 回答 2

1

当我运行你的代码时,它的范围是 1-3000。我不确定你的问题是什么。get char() 似乎有点不合适。

同样,一旦检查了两个,您就不必再除以任何偶数了。此代码适用于 3 - 3000

for(num=3;num<=3000;num++)
   {
         int prime = (num%2 != 0);
         long root = sqrt(num);
         for(divisible_num=3;prime && divisible_num <= root;divisible_num+=2)
         {     
             if(num%divisible_num==0){
                prime = 0;
             }
         }
             if(prime)
             {
             printf("%lu\n", num);
             }
   } 
于 2013-07-20T07:44:03.807 回答
1

最重要的事情是sqrt从 for 循环中调用。你可以计算一次。更好的是,将其全部删除

for(divisible_num=2;divisible_num * divisible_num<=num;divisible_num++)

如果一个数不能被任何小于或等于 sqrt(num) 的素数整除,则该数是素数。

int prime = 1;
for(divisible_num=2;divisible_num * divisible_num<=num;divisible_num++) {
    if (num % divisible_num == 0) {
       prime = 0;
       break; 
    }

}

if (prime) {
    //print the num
} 

您的外循环也必须从 2 开始。

于 2013-07-20T07:31:14.357 回答