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.util.Scanner;

class Main{
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		boolean[] prime=new boolean[50001];

		for(int i=0; i<=50000; i++) {
			prime[i]=false;
		}

		prime[2]=true;
		prime[3]=true;
		for(int i=5; i<=50000; i++) {
			for(int j=2; j*j<=i; j++) {
				if(i%j==0) {
					break;
				}
				if(i%j!=0 && (j+1)*(j+1)>i) {
					prime[i]=true;
				}
			}
		}
		int kotae=0;
		while(true) {
			kotae=sc.nextInt();

			if(kotae==0) {
				System.exit(0);
			}

			if(kotae%2==1) {
				if(prime[kotae-2]) {
					System.out.println(1);
				}
				else {
					System.out.println(0);
				}
			}
			else {
				int dec=0;
				int kosu=0;
				if(prime[kotae/2]) {
					dec=1;
				}
				for(int i=1; i<kotae; i+=2) {
					if(prime[kotae-i] && prime[i]) {
						kosu++;
					}
				}
				System.out.println(kosu/2+dec);
			}
		}
	}
/*
	public static boolean isPrime(int a) {
		if(a<4) {
			if(a==2 || a==3) {
				return true;
			}
			else {
				return false;
			}
		}
		else {
			for(int j=2; j*j<=a; j++) {
				if(a%j==0) {
					return false;
				}
				if(a%j!=0 && (j+1)*(j+1)>a) {
					return true;
				}
		}
		return true;
		}
	}*/
}