hdu 2098 分拆素数和

来源:互联网 发布:网络赌托该不该举报 编辑:程序博客网 时间:2024/06/06 15:40

本题链接:点击打开链接

分拆素数和

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


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


 

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


 

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


 

Sample Input
30260
 


 

Sample Output
32
 


 

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


 

Recommend
lcy   |   We have carefully selected several similar problems for you:  2084 2093 2138 2094 2076 
 
解题思路:这题不难,闲来无事敲着玩玩,只是可能费时比较高,我以前做的用了300多ms,当时还做了好久才搞懂,现在再用打表的方法做了一下就0ms了。
 
 
以前的代码:
#include <stdio.h>#include<math.h>int sushu(int t){    int j;        for(j=2;j<=sqrt(t);j++)        if(t%j==0)        return 0;     return 1;}int main(){    int t,a,b,k,i;    while(~scanf("%d",&t)&&t)    {        k=0;        for(i=3;i<t-i;i+=2)        {        a=sushu (t-i);        b=sushu (i);        if(a&&b)            k++;        }    printf("%d\n",k);   }    return 0;}

现在的代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=10000+10;bool a[maxn];void sushu(){    memset(a,true,sizeof(a));    for(int i=2; i<maxn; i++)    {        if(a[i])            for(int j=i+i; j<maxn; j+=i)            {                a[j]=false;            }    }}int main(){    int n;    sushu();    while(~scanf("%d",&n)&&n)    {        int c=0;        for(int i=2; i<n-i; i++)        {            if(a[i]&&a[n-i])                c++;        }         printf("%d\n",c);    }    return 0;}

反正大家看看就好,水题就不啰嗦了,代码相信大家都懂。
0 0