1. Java, Evgeni Pavlidis
import java.io.*;
import java.util.*;
class Main {
private static int MAX = (int)Math.sqrt(Integer.MAX_VALUE);
private static int SQRT = (int)Math.sqrt(MAX);
private static boolean[] isPrime = new boolean[1000002];
private static long[] prime = new long[50000];
private static int maxPrime = 0;
private static void calcPrimes() {
isPrime[2] = true;
prime[maxPrime++] = 2;
for(int i = 3; i <= MAX; i += 2)
isPrime[i] = true;
for(int i = 3; i <= SQRT; i++)
if(isPrime[i])
for(int j = i+i; j <= MAX; j+= i)
isPrime[j] = false;
for(int i = 3; i <= MAX; i+=2)
if(isPrime[i])
prime[maxPrime++] = i;
}
public static void main(String...args) {
Scanner sc = new Scanner(System.in);
calcPrimes();
long l,u, d1,d2, s1,s2;
long last, minDist, maxDist;
while(sc.hasNextInt())
{
d1 = d2 = s1 = s2 = last = -1;
minDist = Integer.MAX_VALUE;
maxDist = 0;
l = sc.nextInt();
u = sc.nextInt();
// don't take 1 as prime
if(l == 1) l++;
// init whole range(l - u) as primes
for(long i = l; i <= u; i++)
isPrime[(int)(i-l)] = true;
// don't sieve with primes bigger than sqrt(u)
int squareRoot = (int)Math.sqrt(u);
// sieve range
for(int i = 0; i < maxPrime && prime[i] <= squareRoot; i++)
for(long j = (int)Math.floor(l/prime[i]) * prime[i]; j <= u; j += prime[i])
if(j != prime[i] && j >= l)
isPrime[(int)(j-l)] = false;
// find distances
for(long i = l; i <= u; i++)
if(isPrime[(int)(i-l)])
{
if(last != -1 && i - last > maxDist)
{
d1 = last;
d2 = i;
maxDist = d2 - d1;
}
if(last != -1 && i - last < minDist)
{
s1 = last;
s2 = i;
minDist = s2 - s1;
}
last = i;
}
if(s1 == -1)
System.out.println("There are no adjacent primes.");
else
System.out.printf("%d,%d are closest, %d,%d are most distant.\n", s1,s2, d1,d2);
}
}
}
2. C++, Evgeni Pavlidis
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
#define MAX 50000
#define SQRT 216
bool isPrime[1000002];
long prime[MAX]; long maxPrime = 0;
void calcPrimes()
{
isPrime[2] = true;
prime[maxPrime++] = 2;
for(int i = 3; i <= MAX; i += 2)
isPrime[i] = true;
for(int i = 3; i <= SQRT; i++)
if(isPrime[i])
for(int j = i+i; j <= MAX; j+= i)
isPrime[j] = false;
for(int i = 3; i <= MAX; i+=2)
if(isPrime[i])
prime[maxPrime++] = i; }
int main() {
calcPrimes();
long l,u, d1,d2, s1,s2;
long last, minDist, maxDist;
while(cin >> l >> u) {
d1 = d2 = s1 = s2 = last = -1;
minDist = 2000000;
maxDist = 0;
// don't take 1 as prime
if(l == 1)
l++;
// init whole range(l - u) as primes
for(int i = l; i <= u; i++)
isPrime[i-l] = true;
// don't sieve with primes bigger than sqrt(u)
int squareRoot = (int)sqrt(u);
// sieve range
for(int i = 0; i < maxPrime && prime[i] <= squareRoot; i++)
for(long j = (int)(l/prime[i]) * prime[i]; j <= u; j += prime[i])
if(j != prime[i] && j >= l)
isPrime[j-l] = false;
// find distances
for(int i = l; i <= u; i++)
if(isPrime[i-l])
{
if(last != -1 && i - last > maxDist)
{ d1 = last;
d2 = i;
maxDist = d2 - d1;
}
if(last != -1 && i - last < minDist)
{ s1 = last;
s2 = i; minDist = s2 - s1;
} last = i;
} if(s1 == -1)
printf("There are no adjacent primes.\n");
else printf("%ld,%ld are closest, %ld,%ld are most distant.\n", s1,s2, d1,d2);
} return 0;
}