C語言求給定範圍內的所有素數
阿新 • • 發佈:2018-12-31
問題描述
求給定範圍start〜end之間的所有素數。問題分析
判定一個整數m是否為素數的關鍵就是要判定整數m能否被除1和它自身以外的任何其他整數所整除,若都不能整除,則m即為素數。本題求的是給定範圍start〜end之間的所有素數,考慮到程式的通用性,需要從鍵盤上輸入start和end值,例如輸入start=1,end=1000,則所編寫的程式應能夠打印出1〜1000之間的所有素數。
演算法設計
由問題分析可知,該問題考慮用雙層迴圈結構實現。外層迴圈對start〜end之間的每個數進行迭代,逐一檢查其是否為素數。外層迴圈的迴圈變數用變數m表示,m即代表當前需要進行判斷的整數,顯然其取值範圍為start≤m≤end。
內層迴圈稍顯複雜,完成的功能是判斷當前的m是否為素數。設內迴圈變數為m,程式設計時i從2開始,直到為止。用i依次去除需要判定的整數m,如果m能夠被中的任何一個整數所整除,則表示i必然小於或等於,則可以確定當前的整數m不是素數,因此,應提前結束該次迴圈。如果n不能被中的任何一個整數所整除,則在完成最後一次迴圈後,i還需要加1,即,之後才終止迴圈。此時,可以確定當前的整數m為素數。
可以使用標誌位flag來監控內外迴圈執行的情況。在定義變數時將flag初值設為1,在內層迴圈中判斷時,如果m能夠被中的任何一個整數所整除,則在內迴圈中將flag設定為0。如果m不能被中的任何一個整數所整除,則在內迴圈中不會修改flag標誌的值,退出內迴圈後它的值仍為1。此時在外迴圈中對flag的值進行判斷,如果flag=0,則顯然當前的m不是素數,如果flag=1,則當前的m是素數,應該將其打印出來。
還需要注意的是,在外迴圈中,每次要進行下一次迭代之前,要先將flag標誌再次置為1。
程式流程圖:
下面是完整的程式碼:
#include<stdio.h> #include<math.h> int main() { int start, end, i, k, m, flag=1, h=0; do { printf("Input START and END:"); scanf("%d%d", &start, &end); }while(!(start>0 && start<end)); printf("......... prime table(%d-%d).........\n", start, end); for(m=start; m<=end; m++) { k=sqrt(m); for(i=2; i<=k; i++) if(m%i==0) { flag=0; break; } if(flag) { printf("%-4d",m); h++; if(h%10==0) printf("\n"); } flag=1; } printf("\nThe total is %d", h); return 0; }
Input START and END:1 100 ......... prime table(1-100)......... 1 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
轉載來自:c語言中文網