演算法分析:假設對於乙個正數a,如果a的約數只有兩個,1和它本身,那這樣數叫做素數。我們對a在2—a-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 本題主要是關於...