关闭

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

1700人阅读 评论(0) 收藏 举报
分类:

今天刷题刷了这么一道题,

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;
}
结果就不贴了。

0
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:54792次
    • 积分:1223
    • 等级:
    • 排名:千里之外
    • 原创:68篇
    • 转载:7篇
    • 译文:0篇
    • 评论:15条
    最新评论