2015年7月12日 星期日

[C] 列出1~100的質數並計算質數總和

1.原理: 100 = 10*10,所以只要驗證10以內的質數即可
2.利用常數限定數值範圍
3.計算質數總和



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h> 
#define MAX 100
#define MIN 1

int main(void){

     int root=sqrt(MAX);  //sqrt():計算平方根,亦可使用pow(MAX,0.5)

    int prime[root];  //用來存放質因數for檢驗100以內的其他質因數

    int is_prime=1; //bool變數,1表示true,0表示false

     int count,num,i,j,k,l=0,sum=0;





    //create the array of prime,找出10以內的質因數



    prime[0]=2; //先將2放入質因數陣列當中
    count=1; //計算10以內的質因數個數


    for(num=3;num<root;num+=2){ //偶數必為2的倍數,所以檢查奇數即可

         is_prime=1;


        for(i=2;i<num;i++){

           if(num%i==0){

               is_prime=0; //有1與本身之外的其他因數,所以不是質數。

               break;

          }

       }


      if(is_prime){

           prime[count]=num; //抓出作為檢查標準的質因數

           count++;

      }

 }


     //for(j=0;j<count;j++) printf("[%d~%d]:%d is prime (%d)\n",MIN,MAX,prime[j],count);



      //find the prime



     for(j=2;j<=MAX;j++){


          is_prime=1;


          for(k=0;k<count;k++){


              if( j%prime[k]==0 && j!=prime[k] ){ //為了將作為檢查標準的質因數放入

                  is_prime=0;

                  break;

               }


           }


          if(is_prime){

               l++; //計算1~100以內的質數個數

                sum+=j;

               printf("%d.[%d~%d]:%d is prime.\n",l,MIN,MAX,j);

          }

     }



      printf("[%d~%d]:the sum of prime is %d\n",MIN,MAX,sum); 


     system("pause");

     return 0;

}

4 則留言:

  1. 這裡又不得不建議一下,事實上要做素數列表,目前大多都是用「埃氏篩」(埃拉托斯特尼篩法,希臘語:κόσκινον Ἐρατοσθένους)或其變形。在 C 語言用「埃氏篩」,計算上連乘除、餘數計算都用不上,速度飛快。

    提醒一下:使用埃氏篩時,例如要篩5的倍數,從 5x5=25 開始篩就行了、5x6=30也不用篩,因為只要篩裡面剩餘的倍數就行了,因此使用埃氏篩也能夠很快知道 11 的倍數不用篩,因此篩到 7 就停了,因此平方根計算也根本用不上,真的很棒!

    回覆刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除