C語言 判斷質數很簡單

2021-09-05 19:48:00 字數 2730 閱讀 5603

演算法分析:假設對於乙個正數a,如果a的約數只有兩個,1和它本身,那這樣數叫做素數。我們對a2a-1之間取餘,如果還能找到第三個約數,使得餘數為0,那a就不是素數,如果找不到第三個約數,使得餘數不為0,那a就是素數。舉個例子,如果a=5,我們判斷5是不是質數,只要把5分別與2,3,4取餘就好了。即在這個區間範圍上,如果還能找到乙個約數,使得餘數為0,那麼5就不是質數,否則,它就是質數。

**如下:

用上述的方法判斷10以內的數很簡單,但是如果用上述的辦法判斷1000呢?那不把人心態弄崩了?所以上述方法不具備普適性。那有啥普適性的方法來解決這個問題呢?先不說,先跟著我一步一步,循序漸進的學習。

優化01—先優化上述**:優化的核心原因是根據開篇的演算法分析,判斷有沒有第三個約數。

在上述**中,我們增加了乙個變數count來記錄a有多少個約數。變數count的初始值為0。

當a %2==

0成立時,說明2是a的乙個約數,此時count的值加1變為1。同理,當a %3==

0,a %4==

0也成立時,count值也加1變為3。最後我們通過變數count的值,知道了a有幾個約數

同時可以判定a是否為正數。如果count到最後的值仍然是0,即之前的三個if條件語句都不成立,即a不能被2,3,4中的任意乙個數整除,說明a除了1和本身之外,沒有第三個約數了,此時a是質數。反過來,若count到最後的值不是0,說明之前的三個if條件判斷語句中,至少有乙個,最多有三個成立,此時a除了1和本身之外,仍然有第三個約數存在,a不是質數,是合數。

**優化02—**仍然可以優化上述**,如下:

printf("質");

else

printf("合數");

}比較優化01和優化02,我們用

for(i=2;i<=4;i++)//4+1-2來判斷次數 

來代替了

if(a%2==0)

count++;

if(a%3==0)

count++;

if(a%4==0)

count++;

因為我們發現,這三個if語句只有變數值不一樣,即2,3,4,其餘都是一樣的。變數值決定了我們的重複運算元,於是我們想到了用迴圈來解決。此時for隆重登場了!

更深一步思考,當a等於5的時候,只需要判斷2,3,4是不是5的第三個約數(即2,3,a-1)。當a的值不確定的時候,我們需要將

for(i=2;i<=4;i++)//4+1-2來判斷次數
改為

for(i=2;i<=**a-1**;i++)//4+1-2來判斷次數
就可以判斷任意正數a是不是質數了。**如下:

printf("質");

else

printf("合數");

}加一條printf();語句列印合數的約數。**如下:

printf("質");

else

printf("合數");

}類似的,再加一條語句,輸出3~100間所有的素數。**如下:

if(i==a)//最終的質數與最終的i是相等的。

printf("%d\n",i);

}}如果你認認真真地讀完此文,並認真地上機操作,你就已經具備了判斷任何乙個正整數是不是質數的「降龍十八掌」了。

誰說C語言很簡單?

原文 http cocre.com p 873 前兩天,neo寫了一篇 語言的歧義 其使用c語言討論了一些語言的歧義。大家應該也順便了解了一下c語言中的很多不可思異的東西,可能也是你從未注意到的東西。是的,c語言並不簡單,讓我們來看看下面這些示例 為什麼下面的 會返回0?這題應該很簡單吧 int x...

誰說C語言很簡單?

原文 前兩天,neo寫了一篇 語言的歧義 其使用c語言討論了一些語言的歧義。大家應該也順便了解了一下c語言中的很多不可思異的東西,可能也是你從未注意到的東西。是的,c語言並不簡單,讓我們來看看下面這些示例 為什麼下面的 會返回0?這題應該很簡單吧 int x return x 1 x 本題主要是關於...

誰說C語言很簡單?

原文 前兩天,neo寫了一篇 語言的歧義 其使用c語言討論了一些語言的歧義。大家應該也順便了解了一下c語言中的很多不可思異的東西,可能也是你從未注意到的東西。是的,c語言並不簡單,讓我們來看看下面這些示例 為什麼下面的 會返回0?這題應該很簡單吧 int x return x 1 x 本題主要是關於...