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

原创 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和它本身以外不再有其他的因数;否则称为合数。 最小的素数...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年06月04日 18:36
  • 3167

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

埃拉托斯特尼筛法 --- 希腊,筛选素数
  • u012965373
  • u012965373
  • 2016年08月19日 10:11
  • 1166

oracle 序列检查

--序列检查 select SEQUENCE_OWNER, sequence_name, min_value, TO_CHAR(MAX_VALUE) ...
  • simplee
  • simplee
  • 2012年04月13日 13:30
  • 116

埃拉托斯特尼筛法(Sieve of Eratosthenes)简单c实现

leetcode上的一道题目https://leetcode.com/problems/count-primes/ 是关于数素数个数的。 然后根据提示查了下wiki 虽然中文版与英文版出入比较大...
  • baidu_27677097
  • baidu_27677097
  • 2015年05月08日 11:17
  • 402

经典算法——埃拉托斯特尼筛法

一、算法创始人介绍:埃拉托斯特尼(公元前276—公元前194)埃拉托斯特尼是古希腊著名的数学家、地理学家、天文学家。他先在亚历山大港学习,后又转至雅典。公元前236年,托勒密三世指定他为亚历山大图书馆...
  • Jxycat2004
  • Jxycat2004
  • 2006年04月13日 22:30
  • 2620

素数筛法/埃拉托斯特尼筛法(sieve of Eratosthenes)——理解及具体问题

筛法求素数理解及具体问题   素数筛法的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空...
  • huatian5
  • huatian5
  • 2016年04月07日 11:52
  • 571

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

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

埃氏筛法和欧拉筛法的区别

转自: 点击打开链接 Eratosthenes筛法(Sieve of Eratosthenes) 由于思想非常简单,故只给出实现。 1 2 3 ...
  • Baoli1008
  • Baoli1008
  • 2016年03月03日 14:56
  • 3197

高效的计算素数的算法--埃氏筛法

今天看了《编程珠玑 续》很好的一本书,但是也很难懂啊,所以把书中的第一章第二题的答案在电脑上跑了一遍,仔细分析终于明白了。 算法确实精美啊。 功能就是计算小于n=10000的所有素数,并输...
  • lijia11080117
  • lijia11080117
  • 2016年10月28日 16:06
  • 523

119_素数算法之 埃氏筛

寻找n以内的所有的素数,埃氏筛的实现原理如下:  如果发现一个素数,就将其倍数全都删去,那么数组中下一个未被删去的数一定是素数(也是数组中最小的那个数),反复执行,最后得到素数表。  复杂度为O(...
  • qq_31552435
  • qq_31552435
  • 2016年01月04日 16:15
  • 418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:质数筛选方法(埃拉托斯特尼筛法)
举报原因:
原因补充:

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