#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

bool find( int key, vector<int> p )
{
    int left = 0, right = p.size();
    int mid;

    while( left < right )
    {
        mid = ( left + right ) / 2;

        if( p[mid] < key )
            left = mid + 1;
        else if( p[mid] > key )
            right = mid;
        else
            return true;
    }
    return false;
}

int main()
{
    int x = 50000;
    vector<int> pn;

    //50000以下の素数を配列に格納
    for( int i = 2; i <= x; i++ )
    {
        bool judge = true;
        for( int j = 2; j <= sqrt(i); j++ )
        {
            if( i % j == 0 )
            {
                judge = false;
                break;
            }
        }
        if( judge == true )
            pn.push_back(i);
    }

    //整数の入力
    int n;
    while( cin >> n )
    {
        if( n == 0 )
            break;

        if( n % 2 != 0 )
            cout << 0 << endl;
        else
        {
            //方針：2つの素数の和がnとなる場合、(n-片方の素数)がもう一方の素数になるはず。これを探索して、処理効率化。
            int sum = 0;
            for( int i = 0; i < pn.size(); i++ )
            {
                if( pn[i] > n / 2 )                     //整数nの半分を越えたら、組み合わせがかぶるので計算しない。
                    break;
                if( find( n - pn[i], pn ) == true )
                {
                    //cout << n-pn[i] << " + " << pn[i] << " = " << n << endl;
                    sum++;
                }
            }
            cout << sum << endl;
        }
    }
    return 0;
}
