debug到吐,
数论要注意1 不是素数, 这点卡了我有点久
二次筛选都没问题,在选择相邻差最大和最小的时候出了问题,自闭了。
主要是用了线性筛法 筛出 区间【2,根号R】之间的素数,
然后用双重循环去筛选,【l,r】之间的合数,标记后未标记的就是素数。
AC代码
#include<iostream>
#include<math.h>
#include<string.h>
#include<stdio.h>
using namespace std;
#define max_n 1000010
long long l,r;
long long prime[max_n];
long long visit[max_n];
bool lr[1000010];
int b[1000001];
int m=0;
void is_prime(){
int n=sqrt(2147483647);//求的是2~n之间的素数
memset(prime,0,sizeof(prime));
m=0;
for(int i=2;i<=n;i++){
if(visit[i]==0){
visit[i]=i;
prime[++m]=i;
}
for(int j=1;j<=m;j++){
if(prime[j]>visit[i]||prime[j]>n/i)
break;
visit[i*prime[j]]=prime[j];
}
}
}
int main(){
is_prime();
while(cin>>l>>r){
long long dis=r-l;
memset(lr,0,sizeof(lr));
if(l==1)
lr[0]=1;
long long sqrt_r=sqrt(r);
for(int i=1;i<=m;i++){
if(prime[i]>sqrt_r)
break;
for(int j=l/prime[i];j<=r/prime[i];j++){
if(j>1)
lr[j*prime[i]-l]=1;
}
}
int cnt=0;
int x1,x2,y1,y2;
for(int i=l;i<=r;i++){
if(!lr[i-l]) b[++cnt]=i;
}
int t1=2147483647,t2=0;
for(int i=1;i<cnt;i++){
int j=b[i+1]-b[i];
if(j<t1) {t1=j;x1=b[i];y1=b[i+1];}
if(j>t2) {t2=j;x2=b[i];y2=b[i+1];}
}
if(!t2) printf("There are no adjacent primes.\n");
else printf("%d,%d are closest, %d,%d are most distant.\n",x1,y1,x2,y2);
/*long long min1,min2,max1,max2,min,max;
long long last;
min1=min2=max1=max2=min=max=0;
for(int i=0;i<=dis;i++){
if(!lr[i]){
last=l+i;
min1=last;
max1=last;
break;
}
}
for(int i=last-l+1;i<=dis;i++){
if(!lr[i]){
last=l+i;
min2=last;
max2=last;
break;
}
}
if(min2==0){
printf("There are no adjacent primes.\n");
continue;
}
min=min2-min1;
max=max2-max1;
for(int i=last-l+1;i<=dis;i++){
if(!lr[i]){
if(l+i-last>max){
max=l+i-last;
max1=last;
max2=l+i;
}
else if(l+i-last<min){
min=l+i-last;
min1=last;
min2=l+i;
}
last=l+i;
}
}
printf("%d,%d are closest, %d,%d are most distant.\n",min1,min2,max1,max2);*/
}
return 0;
}