質數篩選方法(埃拉託斯特尼篩法)
阿新 • • 發佈:2019-01-02
今天刷題刷了這麼一道題,
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million.
大概意思是10以內的質數加法和為 2 + 3 + 5 + 7 = 17,接著求2000000以內質數加法的和。
分析:要求2000000內質數的和,首先得把2000000內的質數表示出來,我用了上篇部落格的方法,呵呵,半天沒跑出來,這就說明方法不對,上網搜了搜,發現埃氏篩法,它主要是用來求某個數以內的質數。比如n以內的質數,先取其開方,然後從2開始篩選,先去掉2的倍數,接著去掉3的倍數,接著去掉5的倍數,。。。,持續下去,從小到大一直到n的開方,把所有質數的倍數全部去掉,就是n內的所有質數了。
此題的解題方法為:
結果就不貼了。// test10.cpp : 定義控制檯應用程式的入口點。 //埃氏篩法 /* 詳細列出演算法如下: 列出2以後的所有序列: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 標出序列中的第一個素數,也就是2,序列變成: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 將剩下序列中,劃掉2的倍數,序列變成: 2 3 5 7 9 11 13 15 17 19 21 23 25 如果現在這個序列中最大數小於最後一個標出的素數的平方,那麼剩下的序列中所有的數都是素數,否則回到第二步。 本例中,因為25大於2的平方,我們返回第二步: 剩下的序列中第一個素數是3,將主序列中3的倍數劃掉,主序列變成: 2 3 5 7 11 13 17 19 23 25 我們得到的素數有:2,3 25仍然大於3的平方,所以我們還要返回第二步: 現在序列中第一個素數是5,同樣將序列中5的倍數劃掉,主序列成了: 2 3 5 7 11 13 17 19 23 我們得到的素數有:2,3,5 。 因為23小於5的平方,跳出迴圈. */ #include "stdafx.h" #include <iostream> #include <vector> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { long num=2000000; int sq=sqrt(num*1.0)+1; bool *isPrime=new bool[num+1]; //初始化 for(long i=2; i<num+1; i++) { isPrime[i]=true; } for(long i=2; i<sq; i++) { if(isPrime[i]==true) { for(long j=2; j<num+1; j++) { if(j%i==0 && i!=j) { isPrime[j]=false; } } } } long long sum=0; for(long j=2; j<num+1; j++) { if(isPrime[j]==true) { sum=sum+j; } } cout<<sum<<endl; delete []isPrime; system("pause"); return 0; }