求質數(素數)的方法


質數是數學重要的一環,所謂質數,就是除了1和它本身外不存在任何因子的數。以下整理了一下c語言中質數的求法。

問題:輸入一個正整數n(n>=2),求不大於n的全部質數

方法一:循環法

思路:判斷一個數n是不是質數,可以用2到√n之間的所有整數去除n,如果都不能整除,那么n是質數。設計循環嵌套時盡量跳過一些不必要的情況。

1."2"為必輸出的質數,可以單獨輸出。這樣循環可從3到√n判斷。

2.為什么只需要判斷到√n的數呢?

    因為n=√n*√n,n的因數除了√n,其他都是成對存在的,且必定一個大於√n一個小於√n,假設n不是質數,有個因數大於√n(不是n本身),則n必定有一個與之對應的小於√n的因數。

3.除了2以外,不存在是偶數的質數,所以在設計循環時可以設置步數step為2。

代碼:

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int n;
 5     scanf("%d",&n);
 6     printf("2\n");
 7     for(int i=3;i<=n;i+=2)
 8     {
 9         for(int m=3;m<i;m+=2)
10         {
11             if(i%m==0 || m*m>i)
12                 break; 
13         }
14         if(m*m>i)
15             printf("%d\n",i);
16     }
17 
18     return 0;
19 }

輸入:100

運行結果:

方法二:篩法(空間換時間)

思路:把2到n中的所有數都列出來,然后從2開始,先篩去n內所有2的倍數,然后每次從下一個剩下的數(必然為質數)開始,篩去其n內所有的倍數,最后剩下的數都是質數。

1.設置一個數組a[],a[i]的值為1表示i為質數,將所有元素初始化為1

2.篩去m的倍數,即把a[2*m]、a[3*m]…置為0

3.輸出a[i]值為1的i。

代碼:

 1 #include<stdio.h>
 2 #define MAX 100
 3 int s;
 4 int a[MAX];
 5 void prime()
 6 {
 7     s=1;
 8     for(int i=0;i<=MAX;i++)
 9         a[i]=1;
10     a[0]=a[1]=0;
11     for(int i=2;i<=MAX;i++)
12     {
13         if(a[i])
14             a[s++]=i;
15         for(int j=i*2;j<=MAX;j+=i)
16             a[j]=0;
17     }
18 }
19 int main()
20 {
21     prime();
22     for(int i=1;i<s;i++)
23         printf("%d\n",a[i]);
24     return 0;
25 }

MAX設置值:100

運行結果:

 

可以看出,兩種方法都成功得到了結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM