题目:
见https://www.acwing.com/problem/content/198/
思路:
见P138
代码:
中间有几个点非常折磨
#include<iostream>
#include<algorithm>
#include<cmath>
#include<climits>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1e6+10;
int visit[N],prime[N],m,res[N],r,st[N];
int L,U;
void is_prime(int start,int n)
{
for(int i=start;i<=n;i++)
{
if(visit[i]==0) prime[++m]=i;
for(int j=1;j<=m;j++)
{
if(prime[j]>i||i*prime[j]>n) break;
visit[i*prime[j]]=1;
}
}
}
int main()
{
while(cin>>L>>U)
{
m=0;
memset(visit,0,sizeof visit);
memset(prime,0,sizeof prime);
memset(res,0,sizeof res);
memset(st,0,sizeof st);
is_prime(2,int(sqrt(U)));
for(int i=1;i<=m;i++)
{
int p=prime[i];
for(int j=ceil(L/p);j<=floor(U/p);j++)
if(j!=1)//L如果比p小
st[j*p-L]=1;
}
r=0;//这个r非得放这里很奇怪
for(long long i=L;i<=U;i++)//这里非得定义long long也很奇怪
if(!st[i-L]&&i!=1)//i!=1防止L=1的情况
res[++r]=i;
int min_num=INT_MAX,max_num=INT_MIN;
if(r<=1)
cout<<"There are no adjacent primes."<<endl;
else
{
int a,b,c,d;
for(int i=1;i<=r-1;i++)
{
int temp=res[i+1]-res[i];
if(min_num>temp)
{
min_num=temp;
a=res[i];
b=res[i+1];
}
if(max_num<temp)
{
max_num=temp;
c=res[i];
d=res[i+1];
}
}
printf("%d,%d are closest, %d,%d are most distant.\n",a,b,c,d);
}
}
return 0;
}