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

原创 2015年07月10日 20:59:56

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

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

相关文章推荐

判断一个数是不是素数 埃拉托斯特尼筛法 时间复杂度 O(n*lglgn)

说明: 素数的定义:质数(prime number)又称素数。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。 最小的素数...

[java]埃拉托斯特尼筛法检定素数

埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。 给出要筛数...

埃拉托斯特尼筛法 --- 希腊,筛选素数

埃拉托斯特尼筛法 --- 希腊,筛选素数

Sieve of Eratosthenes(埃拉托斯特尼素数筛选法)--java实现

埃拉托色尼筛选法 埃拉托色尼选筛法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一种筛选...

埃氏筛法(筛选素数)

首先,将2到n范围内的所有整数记下来,其中最小的数字2为素数。在表中将2的倍数划去,表中剩下最小的数为3,不能被更小的整除,然后将3的倍数划去。 如果表中剩下的最小数为m,m是素数,然后将表中所有m...

埃拉托斯特尼筛法 快速查找素数

埃拉托斯特尼筛法快速查找素数时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。 输入给出一个正整数数N...
  • bobodem
  • bobodem
  • 2015年10月24日 16:32
  • 581

埃拉托斯特尼筛法

埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由埃及数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。 基于C++...

筛素数解法

常用的筛素数的算有两种: 1). Eratosthenes筛法:把[1,N]素数p的倍数筛出去,剩余的就是素数。 int prime[N], np; bool vis[N]; void get...
  • niuox
  • niuox
  • 2013年02月18日 16:26
  • 1344

O(N)的素数筛选法和欧拉函数

首先,在谈到素数筛选法时,先涉及几个小知识点. 1.一个数是否为质数的判定. 质数,只有1和其本身才是其约数,所以我们判定一个数是否为质数,只需要判定2~(N - 1)中是否存在其约数即可,此种方...

小于等于n的素数的个数(埃式筛选法和欧拉筛选)

问题描述给定数字n,求出小于等于n的素数的个数,假设n
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:质数筛选方法(埃拉托斯特尼筛法)
举报原因:
原因补充:

(最多只允许输入30个字)