2098--拆分素数和

Problem Description

把一个偶数拆成两个不同素数的和,有几种拆法呢?

Input

输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。

Output

对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。

Sample Input

30
26
0

Sample Output

3
2


欧拉筛法

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 10005
int prime[M]={0},vis[M],sum[M]={0};

void eular()
{
    int i,j,num=0,t;
    memset(vis,1,sizeof(vis));
    vis[0] = vis[1] = 0;
    for (i=2,num=0; i<M; i++)
    {
        if (vis[i])
        {
            prime[num++] = i;
        }
        for (j=0; j<num; j++)
        {
            t = i*prime[j];
            if (t < M)
            vis[t] = 0;
            if (i%prime[j] == 0)
            {
                break;
            }
        }
    }

    for (i=0; i<num; i++)
    {
        for (j=i+1; j<num; j++)
        {
            if (prime[i]+prime[j]<=10000)
            sum[prime[i]+prime[j]]++;
        }
    }
}

int main()
{
    eular();
    int n;
    while (scanf ("%d",&n) && n)
    {
        printf ("%d\n",sum[n]);
    }
    return 0;
}
发布了41 篇原创文章 · 获赞 0 · 访问量 8096
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章