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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章