思路
打素数表 for 遍历x1(即p2+1) :x2-x2的最大质因数+1~x2 if i不是素数 x0=min(x0,x1-x1的最大质因数+1) else x0=min(x0,x1);
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int prime[N],cnt,fct[N];
bool st[N];
int ans,x0;
int main(int argc, char** argv) {
cin>>x0;
for(int i=2;i<=x0;i++){
if(!st[i]) prime[cnt++]=i, fct[i]=i;
for(int j=0;prime[j]<=x0/i;j++){
st[prime[j]*i]=true; fct[i*prime[j]]=fct[i];
if(i%prime[j]==0) break;
}
}
ans=x0;
for(int i=x0-fct[x0]+1;i<=x0;i++){
if(st[i]) ans=min(ans,i-fct[i]+1);
else ans=min(ans,i);
}
cout<<ans<<endl;
return 0;
} 
京公网安备 11010502036488号