求質數1 C實現

2021-06-28 08:12:50 字數 1821 閱讀 4459

該問題出自《c語言名題精選百則技巧篇》

試編寫乙個程式,找出前n(如200)個質數。

最初想到的辦法就是讓某個變數i從2到n,然後檢查它是不是質數,如果是的話就顯示出來,如果不是就檢查下乙個,這樣會讓程式變的很慢,每乙個要檢查的數i,都要被2~i-1,除,如果餘數為0則不是質數,如果全部餘數都不為0,則該數是質數。我們現在想辦法來縮小範圍。包括待檢測的變數的範圍和檢測變數需要的被除數2~i-1

(1)縮小待檢測的變數的範圍

我們可以考慮到,2是質數,但是所有2的倍數都不是質數,如果讓i從2變到n,就會很冤枉的測試了4,6,8,10,....這些2的倍數,因此在待測試的變數裡將除去2以外的偶數都去掉,只測試2和奇數;

另外,3是質數,所有3的倍數都不是質數,因此也可以將3的倍數去掉不測試;

現在能將所有2和3的倍數都去掉,將6的倍數去掉,任意連續的6個數,6n,6n+1,6n+2,6n+3,6n+4,6n+5,這六個數里,6n是6的倍數,6n+2是2的倍數,6n+3是3的倍數,6n+4是4的倍數,在這連續的6個數里,至少包含兩個2的倍數和1個3的倍數,在這6個數里,需要檢測的變數只有6n+1和6n+5,因此現在工作量變成了原來的2/6=1/3.

並且我們可以計算要考慮的這些之間的規律,6n,6n+1,6n+2,6n+3,6n+4,6n+5,當n=i-1時要測試的最後乙個值與n=i時要測量的第乙個值的距離是2,本組第乙個要測試的值和第二個要測試的值之間的距離是4,因此,距離是2,4,2,4...可以讓待測試的值從5開始,即i=0時的最後乙個值開始,初始gap=2,下乙個值就是6-gap(4),下一次是6-gap(2)。

(2)縮小被除數的範圍

我們之前考慮被除數是2~i,按照質數的定義,若i只能被1和i本身整除,那麼i是質數,否則i不是質數。所以我們需要用2,3,4,5,6,...,i-1去除i,如果都除不盡,則i是質數。

但是我們可以想一想,當i>2時,有沒有乙個整數可以被i-1整除的,沒有,因為如果i不是質數,那麼i=a*b,a和b既不是1也不是i,因此,a和b的最小值為2,假設a=2,b<=i/2,如果i能被a整除,就一定能被b整除,因此,去除i的數用不著是2~i-1,只要是a和b裡面最小的那個值a的範圍就可以了,因此可以將範圍縮小到2~i/2。

那麼2~i/2是否還可以縮小範圍呢,i=a*b,a和b不同同時大於根號i,因為如果a和b都比根號i大,則a*b>i,因此,a不能大於根號i,a和b裡面的小的那個數a的範圍又縮小了,2~根號i,現在去除i的數縮小範圍到2~根號i。

現在我們還想繼續縮小範圍,和縮小待檢測數的範圍相同,如果2除i除不盡,那麼2的倍數去除i也除不盡;同理3除不盡,3的倍數也除不盡,5除不盡,5的倍數也除不盡,最理想的方法就是用質數去除i,因此範圍縮小到用小於根號i的質數去除i即可。因為和根號i比較可能並不精確,因此可以使prime[i]*prime[i]和i相比。prime[i]為最新檢測出的質數。

程式如下:

Python實現 求質數演算法

質數也就是大於1的整數中,除了1和它本身以外不能被其他整數整除的數,也叫素數。問題 現給定乙個任意整型引數 n n 1 求出小於n 的質數的個數。這裡主要介紹五種演算法,前三種思路一致,主要是效率的差異 第五種採用了埃拉託斯特尼篩法進行計算。例如 輸入 10,輸出 4 2,3,5,7 輸入 20,輸...

學習筆記1 c 實現LRU演算法

leetcode oj上有一道題目,要程式設計實現cache的lru演算法,剛看到這道題的時候,我想到了用佇列來做,但是若用單鏈表來做,必須要儲存尾節點的上乙個節點指標,才能實現快速增加一條資料,程式設計起來很不方便,所以我採用了雙端佇列實現,為了處理方便,儲存兩個帶節點指標,乙個節點的next指向...

求質數3 線性篩法 C實現

該問題出自 c語言名題精選百則技巧篇 從2開始,先刪除2 2,2 2 2,2 2 2 2,接著刪除2 3,2 2 3 2 2 2 3,3並沒有被刪除 再刪除2 5,2 2 5,2 2 2 5,然後刪除2 7,2 2 7,2 2 2 7,然後是2 9,2 2 9,2 2 2 9,當發現p是乙個質數的時...