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;  
   }