一道筆試題

2021-08-22 07:58:40 字數 1645 閱讀 9335

題目是這樣的:判斷乙個小於1000的正整數是否為素數。

素數的定義就不說了,以下直接分析解法,畢竟是在寫與專業相關的東西,是給本專業的人看得,所以看的人應該有點基礎吧?!求素數的問題是乙個數學上的難題,這是常識,但是本題目限制了最大範圍是在1000以內,所以就可以嘗試找出乙個足夠好的解了。首先給出乙個最普通的解,就是取需要判斷的數的平方根為上限,然後從2開始迴圈除以這個需要判斷的數,如果可以被整除那麼就不是素數,否則就是素數。這個解法非常的普通,如果是直接寫程式,應該還說得過去,但是作為選拔人才競爭職位的筆試題這樣的解法是說不過去的。應該充分利用題目中的限制條件給出乙個更好的解。

首先考慮的是慮除偶數,這樣需要處理的數就少了一半。一開始先判斷這個數是否為偶數,如果是那麼就是非素數,否則再開始迴圈按個除。但是這個時候除數不需要偶數了,於是迴圈的次數可以減半,這是乙個能很明顯提高效率的辦法。然後接著考慮,利用判斷偶數去掉了一半,那麼能不能利用是否為3整除,再去掉三分之一呢?這個當然是可以的。如此不斷的想下去,就可以設法去掉四分之一,五分之一...。但是,顯然越往下作效率提高的程度就越不明顯了。因為對於被三整除的數來說由於有些數字是可以同時被2整除的,所以實際上減少的迴圈次數沒有達到三分之一。基於同樣的理由後面減少的次數會比期望的更少。而且還有乙個問題是考慮越多迴圈遞增的控制越不好做。我想到這裡認為,好像減半已經是可以達到的足夠好的解了。那麼事實真的如此麼?赫赫,當然不是,否則就不寫這篇日誌了。通過進一步的考慮我發現還有乙個效率更驚人的做法。

我是這麼想的,如果乙個數不能被2整除那麼以後任何2的倍數都不能整除這個數(這個非常容易理解,不懂得就請不要看這篇日誌了);不能被3整除那麼以後任何3的倍數都不能整除這個數;...。照這個思路想下去,如果一旦這個數能被整除,那麼這個除數是乙個什麼樣的數字呢?這個除數顯然不能被2,3,4...等等所有比它小的數字整除,這個結果也很顯然。好,那麼這個事實恰好是素數的定義。也就是說我們只需要用素數來作除數就可以了。下面的問題是這個結論正確麼,有沒有辦法來驗證呢?寫個程式窮舉?顯然很愚蠢,這樣做的話就一點味道也沒有了,簡直是在侮辱這道題目。正確的做法是尋求證明,我們應該用證明的辦法來保證這個演算法是正確的。這個證明其實不難,因為任何一整數都可以被寫成2(當為偶數時需要),和其它素數的冪指數連乘的形式(這是中學裡的知識,不明白的自己去補課),如果這些因子中的任何乙個都不能整除該數時,那麼這個數就是素數。赫赫,這個證明簡潔吧!好了,演算法的正確性得到證明了,接著就可以幹了。由於題目限制輸入的數小於1000,所以我們需要找出的所有可以當除數的序列是:2,3,5,7,11,13,17,19,23,29,31。那麼大於31的素數需要考慮麼?當然不用,因為大於31的最小素數已經大於1000的平方根了,我們是不需要除的。

下面是源**,當然還有改進的餘地,但是效果已經不明顯了,所以放棄了。順便說一句這些**我沒有測試過阿,有錯不管:

// 返回1是素數,否則不是

int isprimenumber(int nnumber) ;

// 如果這個數不在要求的範圍內,或者是乙個偶數,那麼就不是素數

if (nnumber <= 0 || nnumber >= 1000 || nnumber mod 2 == 0)

return 0;

for (int i = 0; i < 10; i++)

return 1;// 沒有被整除那麼就是素數 }

就是這樣的**,居然還說我寫的不足夠好,而得不到職位,那幫人的素質我就不說了。

一道筆試題

看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...

一道筆試題

上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...

一道MSSQL筆試題

一道mssql筆試題 有一組聯絡歷史,資料量較大。資訊表結構如下 id 主叫號碼 被叫號碼通話起始時間 通話結束時間 通話時長 其中id為主鍵 求其中同乙個號碼的兩次通話之間間隔大於某個時間的聯絡歷史id 不妨設時間間隔為2分鐘 一 select distinct id from tb t wher...