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