求素数 sdut oj 1468(欧拉筛)

原创 2016年07月28日 14:26:26

求素数

Time Limit: 100ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

 

求小于n的所有素数的数量。

输入

 

多组输入,输入整数n(n<1000000),以0结束。

输出

 

输出n以内所有素数的个数。

示例输入

10
0

示例输出

4

///wa了好久的题0.0 今天突然想起来了0.0 不能直接求素数的个数 会超时 

///首先需要预处理,利用欧拉筛原理预处理 bool 数组保存是否为素数 最后遍历加和输出素数的个数 

///Accode


#include <iostream>
#include <cmath>

using namespace std;

const int maxn = 1000010;

int prime[maxn];
bool vis[maxn] = {0};  ///vis[]=0 是素数

void Oula_prime()
{
	int i,j;
	int k = sqrt(maxn+1); ///开方处理

	for(i=2;i<=k;i++)
	{
		if(vis[i] == 0)
		{
			for(j=i;i*j<=maxn;j++)
			{
				vis[i*j] = 1;
			}
		}	
	}
	
	int sum = 0;
	for(i=2;i<=maxn;i++)
	{
		if(vis[i] == 0)
		{
		     sum++;
		}
		prime[i] = sum;
	}
}

int main()
{
	int n;
	Oula_prime();
	while(cin>>n&&n)
	{
		cout<<prime[n]<<endl;
	}
	return 0;
}

///更新于17/1/15

进一步降低了欧拉筛的时间复杂度O(nlogn)

版权声明:有错误麻烦赐教,感激不尽~~~(转载留言哦~)

普通素数 筛法求素数 二次筛法求素数 MillerRabin素数测试【模板】

普通素数判断 筛法求素数[1,N] 二次筛法求素数[L,R] Miller素数测试方法
  • u011676797
  • u011676797
  • 2015年04月15日 13:11
  • 693

筛法求素数优化

之前在一篇博客http://blog.csdn.net/once_hnu/article/details/6302283看到了一个筛法求素数优化的程序,于是好奇写了一下思路,留着以后看什么题用用。都在...
  • yslcl12345
  • yslcl12345
  • 2016年03月28日 21:34
  • 375

筛选法求素数改进

以前稍微总结了下求素数的办法。但是无奈效率都不高。 今天逛了很多关于求素数的博客,于是总结了一下最终写出了一个筛选法的改进算法。 筛选法: (一般筛选法)这种方法比较好理解,初始时,假设全部都...
  • slime_kirito
  • slime_kirito
  • 2015年06月15日 22:24
  • 363

c++求素数个数的几种算法(普通筛、线性筛、Meisell-Lemher模板)

1.普通筛 http://115.231.222.240:8081/JudgeOnline/problem.php?id=1469 数据量较小
  • applewld
  • applewld
  • 2017年05月30日 14:38
  • 488

欧拉线性筛法求素数(顺便实现欧拉函数的求值)

我们先来看一下最经典的埃拉特斯特尼筛法。时间复杂度为O(n loglog n) int ans[MAXN]; void Prime(int n) { int cnt=0; memset(prime...
  • NK_test
  • NK_test
  • 2015年05月29日 23:02
  • 7422

ACM基础知识储备-快速筛法求素数

求素数是程序设计比赛中经常遇到的问题,最基本的方法是通过素数的定义直接判断,只能被1和它本身整除的数就是素数了。这种方法适合判断单个数是否为素数,当要求一个范围内素数而这个范围又比较大时,这种方法就不...
  • stack_queue
  • stack_queue
  • 2016年12月10日 20:46
  • 1691

筛法高效求素数

【问题描述】:    试编写一个程序,找出2->N之间的所有质数。希望用尽可能快的方法实现。 【问题分析】:    这个问题可以有两种解法:一种是用“筛子法”,另一种是“除余法”。    如果...
  • qq_24451605
  • qq_24451605
  • 2015年02月01日 14:22
  • 692

算法之素数筛法

方法一 //判断是否是一个素数 int IsPrime(int a){ //0,1,负数都是非素数 if(a ...
  • SJF0115
  • SJF0115
  • 2013年03月20日 09:08
  • 7880

素数判定(素数筛法)(欧拉)

这里主要说一下素数筛法,该方法可以快速的选取出1~N数字中的所有素数。时间复杂度远小于O(N*sqrt(N)) 方法为:从2开始,往后所有素数的倍数都不是素数。最后剩下的数都是素数。 再说说欧拉公...
  • hynuacmlshk
  • hynuacmlshk
  • 2016年07月20日 15:35
  • 697

求大区间内素数的个数(区间筛法)

闲来无事,补一下小知识。给定整数a和b,请问区间[a,b)内有多少个素数? a#include #include #include #include #include #include #includ...
  • qq_32866009
  • qq_32866009
  • 2017年08月08日 23:36
  • 322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求素数 sdut oj 1468(欧拉筛)
举报原因:
原因补充:

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