素數又稱質數。所謂素數是指除了 1 和它自己之外,不能被任何整數整除的數,例如17就是素數,由於它不能被 2~16 的任一整數整除。
思路1):所以判斷一個整數m是不是素數,只需把 m 被 2 ~ m-1 之間的每個整數去除,若是都不能被整除,那麼 m 就是一個素數。
思路2):另外判斷方法還能夠簡化。m 沒必要被 2 ~ m-1 之間的每個整數去除,只需被 2 ~ 之間的每個整數去除就能夠了。若是 m 不能被 2 ~ 間任一整數整除,m 一定是素數。例如判別 17 是是否爲素數,只需使 17 被 2~4 之間的每個整數去除,因爲都不能整除,能夠斷定 17 是素數。
緣由:由於若是 m 能被 2 ~ m-1 之間任一整數整除,其二個因子一定有一個小於或等於 ,另外一個大於或等於 。例如 16 能被 二、四、8 整除,16=28,2 小於 4,8 大於 4,16=44,4=√16,所以只需斷定在 2~4 之間有無因子便可。
思路一代碼以下:
ios
#include <stdio.h> int main(){ int a=0; // 素數的個數 int num=0; // 輸入的整數 printf("輸入一個整數:"); scanf("%d",&num); for(int i=2;i<num;i++){ if(num%i==0){ a++; // 素數個數加1 } } if(a==0){ printf("%d是素數。\n", num); }else{ printf("%d不是素數。\n", num); } return 0; }
思路二代碼以下:
spa
#include <stdio.h> #include <math.h> void main(){ int m; // 輸入的整數 int i; // 循環次數 int k; // m 的平方根 printf("輸入一個整數:"); scanf("%d",&m); // 求平方根,注意sqrt()的參數爲 double 類型,這裏要強制轉換m的類型 k=(int)sqrt( (double)m ); for(i=2;i<=k;i++) if(m%i==0) break; // 若是完成全部循環,那麼m爲素數 // 注意最後一次循環,會執行i++,此時 i=k+1,因此有i>k if(i>k) printf("%d是素數。\n",m); else printf("%d不是素數。\n",m); return 0; }
來一道簡單的競賽題讓你們練練手:3d
時間限制: 1Sec 內存限制: 128MB 提交: 3567 解決: 2346
題目描述 用簡單素數篩選法求N之內的素數。 輸入 N
輸出 2~N的素數
樣例輸入 100
樣例輸出code
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
答案以下
blog
#include <stdio.h> int main() { int N,i,j; scanf("%d",&N); for(i=2; i<=N; i++) //遍歷2~N之間的全部數 { for(j=2; j<=i; j++) //j至關於0~i之間的全部數,i%若是除0~i之間的全部數都都不能除盡,那麼i是素數。 { //i%j==0說明i能整除j 當i和j相等時,那麼i%j必須爲0 if(i%j==0&&i!=j) //若是j不是在最後一個i=j的狀況下i%j==0,說明在j在取0~i的某個值時,i能將其整除,所以i確定不是素數。 break; if(i%j==0&&i==j) //說明i%(0~i之間)都不能除盡,只有最後i==j的狀況下才能除盡,此時已經把全部數都判斷完了,i是素數 printf("%d\n",i); } } return 0; }
運行結果圖
內存
上題中求2~M之間全部的素數,那麼M~N之間全部的素數應該怎麼求?
//擴展:求M和N間的素數 C++語言 #include <iostream> using namespace std; int main() { int M,N; cin>>M>>N; for(int i=M; i<=N; i++) //遍歷M~N之間全部數 { for(int j=2; j<=i; j++) //j取0~i之間全部數 若是i%(0~i全部數)!==0 則i是素數 { if(i%j==0&&i!=j) break; if(i%j==0&&i==j) cout<<i<<endl; } } }
運行結果圖
ci