C語言求給定範圍內的所有素數程式碼及解析
問題描述
求給定範圍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("輸入 起始數字 和 結束數字:");
scanf("%d%d", &start, &end);
}while(!(start>0 && start<end));
printf("......... (%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("\n共有%d個素數\n", h);
return 0;
}
執行結果:
輸入 起始數字 和 結束數字:1 200
......... (1-200)素數列表.........
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 101 103 107 109
113 127 131 137 139 149 151 157 163 167
173 179 181 191 193 197 199
共有47個素數