2098--拆分素数和

来源:互联网 发布:js array 删除 编辑:程序博客网 时间:2024/06/16 21:22

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 10005int 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;}
0 0