ZOJ 1842 Prime Distance(素数筛选法2次使用)
Prime Distance
Time Limit: 2 Seconds Memory Limit: 65536 KB
The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for thousands of years is the question
of primality. A prime number is a number that is has no proper factors (it is only evenly divisible by 1 and itself). The first prime numbers are 2,3,5,7 but they quickly become less frequent. One of the interesting questions is how dense they are in various
ranges. Adjacent primes are two numbers that are both primes, but there are no other prime numbers between the adjacent primes. For example, 2,3 are the only adjacent primes that are also adjacent numbers.
Your program is given 2 numbers: L and U (1 <= L < U <= 2,147,483,647), and you are to find the two adjacent primes C1 and C2 (L <= C1 < C2 <= U) that are closest (i.e. C2-C1 is the minimum).
If there are other pairs that are the same distance apart, use the first pair. You are also to find the two adjacent primes D1 and D2 (L <= D1 < D2 <= U) where D1 and D2 are as distant from each other as possible (again choosing the first pair if there is
a tie).
Input
Each line of input will contain two positive integers, L and U, with L < U. The difference between L and U will not exceed 1,000,000.
Output
For each L and U, the output will either be the statement that there are no adjacent primes (because there are less than two primes between the two given numbers) or a line giving the two pairs of adjacent primes.
Sample Input
2 17
14 17
Sample Output
2,3 are closest, 7,11 are most distant.
There are no adjacent primes.
题目大意
求两个数之间相邻素数值相差最小和最大的数
分析:这道题是学习素数筛法的经典,应用到了区间筛素数。具体思路是先筛出1到sqrt(2147483647)之间的所有素数,然后再通过已经晒好素数筛出给定区间的素数。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int N=50000;//为什么用到5W?U和L之间的合数,
//质因子不超过O(L^0.5),于是用筛法选出50000内的素数即可,因为50000的平方大于整形上线了
//比如说你只求到1W,但是你有个质数是42347(乱说一个的);那么42347*42347这个数你就不能使他为合数了
//因为你利用的是质数的倍数为合数的筛选法,你没筛选到50000这里
int r[1000000],a[N+100],b[N+100],z; int main()
{
int a0,b0,i,j;
z=0;
memset(a,0,sizeof(a));
for(i=2;i<=N;i++) //1st prime sieve第一次筛选得到5W内的所有质数
if(a[i]==0){
b[++z]=i;//b[z]用来得到a[]中所有的素数z:1->z
for(j=2;i*j<=N;j++) a[i*j]=1;//i的倍数都为1
}
while(~scanf("%d%d",&a0,&b0)){
memset(r,0,sizeof(r));
int t=0,dis,max=-1,min=9999999,m1,m2; for(i=1;i<=z;i++){ //prime sieve again(b[1]到b[z]的素数)
if(b[i]>b0)break;//对于一些小数据来说可以直接就中断掉了
int s,t;
s=(a0-1)/b[i]+1;//if(a0%b[i]==0)a0/b[i]==(a0-1)/b[i]+1;往上取整
t=b0/b[i];//往下取整 这样取整的目的是为了让0<=j*b[i]-a0<=b0-a0 不然其他取整会超出范围
for(j=s;j<=t;j++)//j的取值一定是>=1 如果是==1的情况 说明(a0-1)<b[i]即a0<=b[i]
if(j>1) r[j*b[i]-a0]=1;//r[]==1表示为合数(为了限定范围在0<->(b0-a0),其实意思是j*b[i]是一个合数)
}//j!=1 举 1,20 b[i]=7 这时s=1,t=2 if(j==1)可以 则[1*7-1]=1 正如上面所说后面还要a0=1 难道说7是合数?
//总的来说,j==1时 b[i]是质数 j*b[i]-a0+a0肯定也是质数 int k=-1;
for(i=0;i<=b0-a0;i++)
if(!r[i]){//如果r[i]==0 (不是合数的情况)
if(k!=-1){//第一个是不能计的至少要两个
dis=i-k;//与前一次的差
if(dis>max){
max=dis;
m1=i+a0;//m1表示的是最大值
}
if(dis<min){
min=dis;
m2=i+a0;//m2表示的是第二小
} }
if(i+a0!=1) k=i;//第一次是这个用来下一次的使用
// k=i;//这样是错的 注意当a0=1的时候r[0]是一定为0的但是[举[1,2]]
//如果这边没注意让 k=0的话,max=i-0,mi=i+a0(1);显然当元素中只有一个素数的时候是不能输出结果 但是这样却有结果
} //if(max<0)说明没有进行过任何比较
if(max<0) printf("There are no adjacent primes.\n");
else printf("%d,%d are closest, %d,%d are most distant.\n",m2-min,m2,m1-max,m1);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
ZOJ 1842 Prime Distance(素数筛选法2次使用)的更多相关文章
- POJ2689 - Prime Distance(素数筛选)
题目大意 给定两个数L和U,要求你求出在区间[L, U] 内所有素数中,相邻两个素数差值最小的两个素数C1和C2以及相邻两个素数差值最大的两个素数D1和D2,并且L-U<1,000,000 题解 ...
- zoj 1842 Prime Distance
// 数论题,增强的筛法,回想素数筛法 // 只要筛到最大数的开方,剩下的就是素数 // 于是这里,开一个 sqrt(2^31) 大约 65536 的素数表,然后 // 对于每个 L~U 的区间,筛掉 ...
- POJ 2689 Prime Distance (素数筛选法,大区间筛选)
题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数. 用素数筛选法.所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数.由于sqrt(U) ...
- PAT甲题题解-1059. Prime Factors (25)-素数筛选法
用素数筛选法即可. 范围long int,其实大小范围和int一样,一开始以为是指long long,想这就麻烦了该怎么弄. 而现在其实就是int的范围,那难度档次就不一样了,瞬间变成水题一枚,因为i ...
- 素数筛选法(prime seive)
素数筛选法比较有名的,较常用的是Sieve of Eratosthenes,为古希腊数学家埃拉托色尼(Eratosthenes 274B.C.-194B.C.)提出的一种筛选法.详细步骤及图示讲解,还 ...
- POJ 3978 Primes(素数筛选法)
题目 简单的计算A,B之间有多少个素数 只是测试数据有是负的 //AC //A和B之间有多少个素数 //数据可能有负的!!! #include<string.h> #include< ...
- LightOJ 1259 Goldbach`s Conjecture (哥德巴赫猜想 + 素数筛选法)
http://lightoj.com/volume_showproblem.php?problem=1259 题目大意:给你一个数n,这个数能分成两个素数a.b,n = a + b且a<=b,问 ...
- poj 2262 Goldbach's Conjecture(素数筛选法)
http://poj.org/problem?id=2262 Goldbach's Conjecture Time Limit: 1000MS Memory Limit: 65536K Total ...
- HDU_2136——最大质因数,素数筛选法
Problem Description Everybody knows any number can be combined by the prime number. Now, your task i ...
随机推荐
- HTML5纯Web前端也能开发直播,不用开发服务器(使用face2face)
前段时间转载了某位大神的一篇文章,开发Web版一对一远程直播教室只需30分钟 - 使用face2face网络教室.非常有意思.看起来非常简单,但作为一名前端开发人员来说,还是有难度.因为要开发服务器端 ...
- Redis 之武林大会 - 哨兵(Sentinel)
前言 Redis在出从复制的模式下,一旦主节点由于故障不能提供服务,需要人工降从节点晋升为主节点,同时还要通知应用方更新主节点的地址,在很多应用场景下,这样的故障处理方式是无法被接受的.不过幸运的是R ...
- Windows8系统下设置Mongodb开机启动
1. 官网下载安装 MongoDB https://www.mongodb.com/ 2. 环境变量设置 把 mongod.exe 所在路径加入到环境变量的PATH, 我这里安装的路径是 D:\db\ ...
- RUBY惯用方法(转)
RUBY惯用方法 目录 迭代 ||=赋值 程序入口 预设变量和特殊记号 inject 并行赋值 *的匹配 rescue简单用法 命名参数的默认值 精细duck typing控制 获取metaclass ...
- Leecode刷题之旅-C语言/python-389 找不同
/* * @lc app=leetcode.cn id=389 lang=c * * [389] 找不同 * * https://leetcode-cn.com/problems/find-the-d ...
- EJS 模板中,js 如何获取后端传来的数据
在 ejs 模板中,想让 js 的代码获得后端传来的数据,要在<%=%>的外面加一对引号. 如下图,从后端给 chatroom.ejs 传进去一个 avatar 变量,是个字符串类型的. ...
- Linux - 时间相关命令 - ntpdate, date, hwclock
1. 概述 最近也不知道写啥了, 把之前的老文档整理一下, 凑个数什么的 配置时间这种工作, 偶尔还是要用一下 主要描述 3 个命令的简单适用 ntpdate hwlock 2. ntpdate 1. ...
- java入门---变量类型&类变量&局部变量&实例变量&静态变量
在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...] ; ...
- 20155311 《Java程序设计》实验四 (Android程序设计)实验报告
20155311 <Java程序设计>实验四 (Android程序设计)实验报告 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android.组 ...
- [agc011F]Train Service Planning-[线段树优化dp+神秘思考题]
Description 传送门 Solution 请围观lhx大佬的博客(大佬写的太好了我都没有写的动力了em) Code #include<iostream> #include<c ...