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;
}