HDU2098_分拆素数和

来源:互联网 发布:太原java培训机构 编辑:程序博客网 时间:2024/06/05 01:19

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768K (Java/Others)
Total Submission(s): 39746 Accepted Submission(s): 17390

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

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

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

Sample Input
30
26
0

Sample Output
3
2

Source
2007省赛集训队练习赛(2)

思路
首先用Eratosthenes筛选法求得必要的素数,然后用试探法求可分解的个数,对于输入的偶数sum而言,如果能够分解成两个素数之和,其中一个必然小于或等于sum/2,基于这个原理进行分解计数,最后求出所有的组合

C语言代码

#include<stdio.h>#include<stdbool.h>//bool定义所需头文件 #define max 10000int arr[max+1];void Erat(int arr[max],int n){    int i,j;    bool flag1=true;    bool flag2=false;    arr[1]=flag2;    for(i=2;i<=n;i++)    {        arr[i]=flag1;    }    for(i=2;i<=n;i++)    {        if(arr[i]==flag1)        {            for(j=i*i;j<=n;j+=i)            {                arr[j]=flag2;            }        }    }} int main(){    int i,sum,count;    Erat(arr,max);    while(scanf("%d",&sum)&&sum)    {        count=0;        for(i=0;i<sum/2;i++)        {            if(arr[i]&&arr[sum-i])                if(i!=sum-i)                    count++;        }        printf("%d\n",count);    }    return 0;}