先給出素數的定義:
算法思考:
判斷一個數是不是素數,只需要判斷它是不能只能被1和自身整除。
那怎麼判斷一個數不能被除1和自身之外的其他數整除呢?想法是寫一個循環,循環裡依次除以從2到這個數減1的所有的整數,如果都不能整除,說明這個數是素數;如果出現一個能整除的數,那麼這個數不是素數。
(其實,判斷素數還可以優化,循環裡依次除以從2到這個數平方根的所有的整數就可以了。因為假設一個數n,除以2~根號n的整數,都不能整除,那麼除以根號n~n-1的整數也不能整數。在文章最後再貼上優化的代碼。)
那怎麼判斷能不能整除呢?我麼知道C語言有求餘數的運算符%,如果餘數是0,那麼說明能整除了。
我們來寫程序代碼。這裡,說明一下,當你寫一個具有某個功能的代碼的時候,把這個功能寫成一個函數,而不是所有的代碼都放在main函數裡。在main函數裡調用這個你寫的函數。
給函數命名,如果你知道或者查到了素數的英文單詞是prime number,那麼函數可以起名為 is_primer_number(如果你不知道素數的英文單詞,那麼隨便起個名字也可以,比如叫fun)。因為要傳遞一個代判斷的整數,所以有一個int類型參數。返回值我們用bool型(代碼裡要包含頭文件stdbool.h),如果是素數返回true,如果不是素數返回false。
代碼:
bool is_prime_number(int a)
{
for (int i = 2; i < a ; i++){
if (a % i == 0)
return false;
}
return true;
}
判斷是不是素數的函數寫好了。題目是要求1到1000之間所有的函數。你可以再寫一個函數,函數的功能是求1到某個整數之間的所有素數並列印。函數命名為print_prime_num。有一個int類型參數。返回值我們寫為整型,返回素數的個數。
循環把2到這個數之間的每個整數,作為參數,傳給上面寫的函數is_prime_number(),如果是素數,就列印。
int print_prime_number(int a)
{
int count = 0;
for (int i = 2; i<=a; i++ ){
if(is_prime_number(a)){
count++;
printf("%d\n", a);
}
}
}
main函數的寫法。輸入一個整數,作為參數,傳給函數print_prime_number()處理:
int main ()
{
int a;
printf("求1到一個整數之間所有的素數.\n");
printf("請輸入一個整數: \n");
scanf("%d", &a);
print_prime_number(a);
return 0;
}
運行結果:
優化
判斷素數的函數還可以優化,循環裡依次除以從2到這個數平方根的所有的整數就可以了。因為假設一個數n,除以2~根號n的整數,都不能整除,那麼除以根號n~n-1的整數也不能整數。所以我們只要循環2~根號n之間的數就可以了。
函數is_prime_number()可以寫為下面這樣。這裡用到了求平方根的函數sqrt(),要包含頭文件math.h。另外,函數sqrt()的返回類型是double,但是這裡我們要的是整數,所以加上(int)強制轉換為整型。
bool is_prime_number(int a)
{
for (int i = 2; i < (int)sqrt(a) +1 ; i++){
if (a % i == 0)
return false;
}
return true;
}
運行結果:
點擊這裡留言和查看留言哦!
在看和收藏也是對作者的鼓勵哦!