线性筛选素数 合数存在素数因子
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int[] prime = new int[1000005];
static boolean[] vis = new boolean[1000005];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
Arrays.fill(vis, false);
int cnt = 0;
//线性筛选素数
for(int i=2;i<=50005;i++) { //一个合数一定存在一个素数因子且小于等于sqrt(n) 所以只需要筛选sqrt(2^31)以下的素数
if(!vis[i])
prime[cnt++] = i;
for(int j=0;i*prime[j]<=50005;j++) {
vis[i*prime[j]] = true;
if(i%prime[j]==0) break;
}
}
int l = sc.nextInt();
int r = sc.nextInt();
Arrays.fill(vis, false);
for(int i=0;i<cnt;i++) {
long p = prime[i];
//筛选出[l,r]的因子为素数p的合数
for(long j=Math.max((l+p-1)/p*p,2*p);j<=r;j+=p) { //j的初值为[l,r]中第一个合数的因子为p
vis[(int)(j-l)] = true;
}
}
int k = 0,minp = 1,maxp = 1;
for(int i=0;i<=r-l;i++) { //筛选出[l,r]的素数
if(!vis[i]&&i+l>1) {
prime[k++] = i+l;
}
}
if(k<2) {
System.out.println("There are no adjacent primes.");
}else {
for(int i=1;i<k;i++) {
int d = prime[i]-prime[i-1];
if(d<prime[minp]-prime[minp-1]) minp = i;
if(d>prime[maxp]-prime[maxp-1]) maxp = i;
}
System.out.printf("%d,%d are closest, %d,%d are most distant.\n", prime[minp-1], prime[minp], prime[maxp-1], prime[maxp]);
}
}
}
}