Problem:
ゴールドバッハの予想

4 以上の偶数は 2 つの素数の和で表すことができるということが知られています。これはゴールドバッハ予想といい、コンピュータの計算によりかなり大きな数まで正しいことが確かめられています。例えば、10 は、7 + 3、5 + 5 の 2 通りの素数の和で表すことができます。

整数 n を入力し、n を 2 つの素数の和で表す組み合わせ数が何通りあるかを出力するプログラムを作成してください。ただし、n は 4 以上、50,000 以下とします。また、入力される n は偶数であるとはかぎりません。

Input

複数のデータセットが与えられます。各データセットに n が１行に与えられます。n が 0 のとき入力の最後とします。データセットの数は 10,000 を超えません。

Output

各データセットに対して、n を 2 つの素数の和で表す組み合わせ数を１行に出力して下さい。

Sample Input

10
11
0

Output for the Sample Input

2
0

Solution in JAVA (judge verdict: Time Limit Exceeded)

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

	private static final int MAX = 50000;
	public static void main(String[] args) {
		final int[] primeTable = getPrimeNumbers(MAX);
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			int target = sc.nextInt();
			if(target == 0)	break;
			System.out.println(getNumCombination(target, primeTable));
		}
	}
	
	public static int getNumCombination(int targetNumber, int[] primeTable){
		if(targetNumber % 2 == 1)	return 0;
		
		int c = 0;
		int length = primeTable.length;
		for(int i = length - 1; i >= 0; i--){
			if(targetNumber < primeTable[i]) continue;
			for(int j = 0; j < length && j <= i; j++){
				if(targetNumber == primeTable[i] + primeTable[j])	c++;
			}
		}
		return c;
	}
    private static int[] getPrimeNumbers(int n){
    	ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i = 2; i < n + 1; i++){
            if(isPrimeNumber(i)){
            	list.add(i);
            }
        }
        int[] primeNumbers = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
        	primeNumbers[i] = list.get(i);
        }
        return primeNumbers;
    }
    private static boolean isPrimeNumber(int n){
    	if(n == 2){
    		return true;
    	}
    	else if(n % 2 == 0){
    		return false;
    	}
    	
    	for(int i = 3; i  * i < n + 1; i = i + 2){
    		if(n % i == 0){
    			return false;
    		}
    	}
    	return true;
    }
}