1928: Prime Distance
Result | TIME Limit | MEMORY Limit | Run Times | AC Times | JUDGE |
---|---|---|---|---|---|
![]() | 3s | 8192K | 99 | 25 | Standard |
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
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;
}