您的位置:首页 > 其它

质数筛选方法(埃拉托斯特尼筛法)

2015-07-10 20:59 369 查看
今天刷题刷了这么一道题,

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;
}
结果就不贴了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: