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: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;


public class Main {
	private	static	BufferedReader		br      = null;
	private	static	ArrayList<Integer>	borders = null;

	static {
		br      = new BufferedReader(new InputStreamReader(System.in));
		borders = new ArrayList<Integer>();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		parseBorder();
		byte[]	sum = createSumList();

		int nLen = borders.size();
		for (int n = 0; n < nLen; n++) {
			System.out.println(sum[borders.get(n)-1]);
		}
	}

	private static void parseBorder() {
		int	nNum = 0;
		while((nNum = parseNum()) != 0) {
			borders.add(nNum);
		}
	}

	private static int parseNum() {
		int		num    = 0;
		String	strNum = parseStdin();

		if (strNum != null) {
			num = Integer.parseInt(strNum);
		}

		return num;
	}

	private static String parseStdin() {
		String	strNum = null;

		try {
			String line = br.readLine();
			if (line != null) {
				if (!line.isEmpty()) {
					strNum = line;
				}
			}
		}
		catch (IOException e) {}

		return strNum;
	}

	private static byte[] createSumList() {
		byte[]				aSum   = null;
		ArrayList<Integer>	prime = new ArrayList<Integer>();
		boolean				bPrime = true;
		int					nPrime = 0;
		Object[]			aWork  = borders.toArray();
		int					nPr1   = 0;
		int					nPr2   = 0;
		int					nLen   = 0;
		int					nMax   = 0;

		Arrays.sort(aWork);
		nMax = (Integer)aWork[aWork.length - 1];

		prime.add(2);
		for(int nNum = 3; nNum <= nMax; nNum += 2) {
			bPrime = true;

			for (int nLoop = 0; nLoop < prime.size(); nLoop++) {
				nPrime = prime.get(nLoop);
				if (nPrime <= (int)Math.sqrt((double)nNum)) {
					if (nNum % nPrime == 0) {
						bPrime = false;
						break;
					}
				}
				else {
					break;
				}
			}

			if (bPrime) {
				prime.add(nNum);
			}
		}

		aSum = new byte[nMax];
		nLen = prime.size();
		for (int a = 0; a < nLen; a++) {
			nPr1 = prime.get(a);
			if (nPr1 > nMax) {
				break;
			}
			for (int b = a; b < nLen; b++) {
				nPr2 = prime.get(b);
				if (nPr1 + nPr2 > nMax) {
					break;
				}
				aSum[nPr1 + nPr2 - 1]++;
			}
		}

		return aSum;
	}
}