joj1928
来源:互联网 发布:华为交换机端口绑定 编辑:程序博客网 时间:2024/05/17 07:15
1928: Prime Distance
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 1714 17
Output for Sample Input
2,3 are closest, 7,11 are most distant.There are no adjacent primes.
This problem is used for contest: 190
这是一个让人非常蛋疼的一个题目,这个题目太阴了,原来题目中用红色标注的数字是int所能表示的最大值。因此在计算过程中
很可能会出现比这个值更大的数值,因此计算过程中必须用long long。。。。。
#include<iostream>
#include<stdio.h>
using namespace std;
bool prime1[50000+1];
bool prime2[1000000+1];
int prime3[1000000+1];
int main()
{
for(int i=3;i<=50000;i++)
{
if(i%2==0)prime1[i]=0;
else prime1[i]=1;
}
for(int i=3;i*i<=50000;i++)
{
if(prime1[i])
{
for(int j=i*i;j<=50000;j+=i)prime1[j]=0;
}
}
prime1[2]=1;prime1[1]=prime1[0]=0;
int l,c;
while(scanf("%d%d",&l,&c)==2)
{
for(long long i=l;i<=c;i++)//此处的i必须是longlong否则c+1就会超出int的范围
{
if(i%2==0)prime2[i-l]=0;
else prime2[i-l]=1;
}
for(long long i=3;i*i<=c;i+=2)//此处i必须是longlong型的否则就超出int的范围了。
{
if(prime1[i])
{
for(long long j=(l/i>2?l/i:2)*i;j<=c;j+=i)
{
if(j-l>=0)
prime2[j-l]=0;
}
}
}
if(l==2)prime2[0]=1;
if(l==1)
{
prime2[0]=0;prime2[1]=1;
}
int count=0;
for(int i=0;i<=c-l;i++)
{
if(prime2[i])
{
prime3[++count]=i+l;
}
}
if(count<=1)cout<<"There are no adjacent primes."<<endl;
else
{
int max=-1;int min=c;
int hmax,tmax,hmin,tmin;
for(int i=1;i<=count-1;i++)
{
if(prime3[i+1]-prime3[i]>max)
{
max=prime3[i+1]-prime3[i];
hmax=prime3[i];tmax=prime3[i+1];
}
if(prime3[i+1]-prime3[i]<min)
{
min=prime3[i+1]-prime3[i];
hmin=prime3[i];tmin=prime3[i+1];
}
}
printf("%d,%d are closest, %d,%d are most distant.\n",hmin,tmin,hmax,tmax);
}
}
return 0;
}
- joj1928
- 高级程序员的必学
- 以为IT前辈的20年编程经验
- 信息安全人员关注网站
- Java中容易忽略的问题(表达式篇,根据java解惑归纳)
- 什么是线程安全
- joj1928
- 基于消息队列的信息传输机制
- css透明,未验证
- 由java.lang.OutOfMemoryError: Java heap space发现的安装版与解压版 tomcat的区别和配置
- 资治通鉴,曹操之后的又一个大英雄,后赵开国国主-石勒,洒脱,豁达
- 《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九:导航结构层次
- 设置开机自动启动vsftp(写得很清楚的)
- OS相关
- XSD属性详解