1. 程式人生 > >質數篩選方法(埃拉託斯特尼篩法)

質數篩選方法(埃拉託斯特尼篩法)

今天刷題刷了這麼一道題,

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;
}
結果就不貼了。