質數是數學重要的一環,所謂質數,就是除了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
運行結果:
可以看出,兩種方法都成功得到了結果。