POJ 3978 Primes(求范围素数个数)

id=3978">http://poj.org/problem?

id=3978

题意:

给你一个区间范围A和B,要你求出[A,B]内的素数个数。当中B<=100000。

分析:

首先我们求出2到10W的素数表。把每一个素数按从小到大的顺序保存在prime数组中。然后我们用二分查找找到A的下界和B的上界,然后用上界-下界即为素数个数。

程序实现用了两种筛选法来求素数表。两种筛选法都是基于每一个自然合数都能够分解为:最小素因子p*剩余部分q。

且q>=p。

第一种方式是主要的筛选法,效率慢些。只是也趋近于线性了。

另外一种方式效率是O(n)的。以下解释下另外一种筛选法的原理:

上面的筛选法为什么一定能过滤掉全部的合数呢?

一个合数=它的最小素因子*它的剩下部分(该部分肯定>=最小素因子)

如果当前循环到30。那么因为30=2*15 且15之前被推断过肯定是合数。所以当前prime[30]肯定是1。

同理如果当前循环到合数x,且x中最小素因子为p且x=p*q。

那么之前i==q时的那次循环。必定会标记prime[p*q]=1

从而使得x老早就被标记成了合数。

AC代码:筛选法1

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100000;
//筛选法一求素数表
int prime[maxn+5];
int p[maxn+5];
int get_prime()
{
prime[0]=0;
memset(p,0,sizeof(p));
int bound=sqrt(maxn)+1;//边界
for(int i=2;i<=bound;i++)
{
if(p[i]==0)//i是一个素数
{
for(int j=i*i;j<=maxn;j+=i)
p[j]=1;
}
}
for(int i=2;i<=maxn;i++)if(p[i]==0)
prime[++prime[0]]=i;
return prime[0];
} int main()
{
int x=1;
get_prime();
int a,b;
while(scanf("%d%d",&a,&b)==2)
{
if(a==-1&&b==-1)break;
if(a<2) a=0;
if(b<2) b=0;
int L=lower_bound(prime+1,prime+prime[0], a)-prime;
int R=upper_bound(prime+1,prime+prime[0], b)-prime;
printf("%d\n",R-L);
}
return 0;
}

AC代码:筛选法2

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100000; //筛选法二求素数
int prime[maxn+5];
int get_prime()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=maxn;i++)
{
if(prime[i]==0) prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)
{
prime[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
return prime[0];
} int main()
{
int x=1;
get_prime();
int a,b;
while(scanf("%d%d",&a,&b)==2)
{
if(a==-1&&b==-1)break;
if(a<2) a=0;
if(b<2) b=0;
int L=lower_bound(prime+1,prime+prime[0], a)-prime;
int R=upper_bound(prime+1,prime+prime[0], b)-prime;
printf("%d\n",R-L);
}
return 0;
}

POJ 3978 Primes(求范围素数个数)的更多相关文章

  1. LightOj 1197 - Help Hanzo(分段筛选法 求区间素数个数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1197 题意:给你两个数 a b,求区间 [a, b]内素数的个数, a and b ( ...

  2. POJ 3978(求素数)

    知识点:      1.求素数的test,从2~sqrt(n):           2.假设数据非常多,能够用素数表记录,然后sum=prime[m]-prime[n]求得! ! !! !!! !! ...

  3. POJ 3978 Primes(素数筛选法)

    题目 简单的计算A,B之间有多少个素数 只是测试数据有是负的 //AC //A和B之间有多少个素数 //数据可能有负的!!! #include<string.h> #include< ...

  4. LeetCode Count Primes 求素数个数(埃拉托色尼筛选法)

    题意:给一个数n,返回小于n的素数个数. 思路:设数字 k =from 2 to sqrt(n),那么对于每个k,从k2开始,在[2,n)范围内只要是k的倍数的都删掉(也就是说[k,k2)是不用理的, ...

  5. SPOJ CNTPRIME 13015 Counting Primes (水题,区间更新,求区间的素数个数)

    题目连接:http://www.spoj.com/problems/CNTPRIME/ #include <iostream> #include <stdio.h> #incl ...

  6. 求小于n的素数个数

    本文是对 LeetCode Count Primes 解法的探讨. 题目: Count the number of prime numbers less than a non-negative num ...

  7. 求0到n之间素数个数的序列

    要求: (1) 找出0-1000之间素数(2) 设f(n)表示0-n之间的素数个数,计算出当n=0,1,2,3,.....,997时f(n)的值,并写入文件 分析: 首先找素数使用一个效率较高的方法- ...

  8. Help Hanzo lightof 1197 求一段区间内素数个数,[l,r] 在 [1,1e9] 范围内。r-l<=1e5; 采用和平常筛素数的方法。平移区间即可。

    /** 题目:Help Hanzo lightof 1197 链接:https://vjudge.net/contest/154246#problem/M 题意:求一段区间内素数个数,[l,r] 在 ...

  9. POJ 2299 求逆序对个数 归并排序 Or数据结构

    题意: 求逆序对个数 没有重复数字 线段树实现: 离散化. 单点修改,区间求和 // by SiriusRen #include <cstdio> #include <cstring ...

随机推荐

  1. 假金币问题-PKUacm1029-ACM

    假金币 “Gold Bar”银行收到可靠消息:在前次的N 个金币中有一枚重量不同的假金币(其他金币的重量都相同).经济危机之后他们只有一台天平可用.用这台天平,可以称量出左边托盘中的物体是轻于.重于或 ...

  2. Python学习 - 使用BeautifulSoup来解析网页一:基础入门

    写技术博客主要就是总结和交流的,如果文章用错,请指正啊! 以前一直在使用SGMLParser,这个太费时间和精力了,现在为了毕业设计,改用BeautifulSoup来实现HTML页面的解析工作的. 一 ...

  3. centos下Elasticsearch数据迁移与备份

    ########### ### 共享创建es官方网站就一句话 ########   1.下载 文件共享 .. rpm -i http://mirror.symnds.com/distributions ...

  4. 如何调整iMindMap打印设置

    打印何尝不是一种保存.导出iMindMap思维导图的一种方法,我们还可以通过调整打印设置来满足我们不同的需求.下面小编就给你翻一翻iMindMap中文版教程,教你怎样调整打印设置. 我们在打开iMin ...

  5. 理解Java(StringBuffer和StringBuilder)

    StringBuffer可实现同步,StringBuilder线程不安全. 翻译自Java API英文文档 本质 StringBuffer 和 StringBuilder 均表示一个可变字符序列 这个 ...

  6. 工作总结:将电脑中的ARP缓存清空黑屏命令

    ARP -d 将电脑中的ARP缓存清空ARP-a  查看arp缓存arp-s   ip与mac绑定

  7. c# appdomain

    http://www.cnblogs.com/Terrylee/archive/2005/11/28/285809.html

  8. 【转】近百个Android优秀开源项目

    近百个Android优秀开源项目   Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他们的智慧 ...

  9. HashMap通过value反查key

            这是今天做了一道字符串的问题,一直MLE,所以想到了减少Map里对应关系数量来降低内存开销.随手谷歌,整理出了如下资料.       如果效率优先的话还是写俩Map吧. import ...

  10. 通过 IDE 向 Storm 集群远程提交 topology

    转载: http://weyo.me/pages/techs/storm-topology-remote-submission/ http://www.javaworld.com/article/20 ...