思路
打素数表
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;
}