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: Accepted)

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

public class Main {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = "";

		boolean[] indexes = indexesOfPrime(50001);
		int[] values = valuesOfPrime(indexes);

		while (!(line = br.readLine()).equals("0")) {

			int n = Integer.parseInt(line);
			int c = 0;

			for (int v : values) {
				if (v * 2 > n) {
					break;
				}
				if (indexes[v] && indexes[n - v]) {
					c++;
				}
			}
			System.out.println(c);
		}

	}

	static boolean[] indexesOfPrime(int max) {

		boolean[] indexes = new boolean[max + 1];
		Arrays.fill(indexes, true);

		for (int i = 2; i < max + 1; i++) {
			if (indexes[i]) {
				for (int j = 2; j <= max / i; j++) {
					indexes[i * j] = false;
				}
			}
		}

		return indexes;

	}

	static int[] valuesOfPrime(boolean[] indexes) {

		int count = 0;
		for (int i = 2; i < indexes.length; i++) {
			if (indexes[i]) {
				count++;
			}
		}

		int[] values = new int[count];
		int j = 0;
		for (int i = 2; i < indexes.length; i++) {
			if (indexes[i]) {
				values[j] = i;
				j++;
			}
		}

		return values;

	}

}