hdoj 分拆素数和 2089 (素数打表++枚举)

来源:互联网 发布:seo技术是什么意思 编辑:程序博客网 时间:2024/05/16 08:55

分拆素数和

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


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

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

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

Sample Input
30260

Sample Output
32
//代码不好,,运行时间太长了(780Ms)。。。
#include<stdio.h>#include<string.h>#define N 10010int p[N];bool pp[N];int pnum;int getp(){int i,j;memset(pp,false,sizeof(pp));for(i=2;i<N;i++){if(!pp[i])p[pnum++]=i;for(j=0;j<pnum&&p[j]*i<N;j++){pp[p[j]*i]=true;if(i%p[j]==0)break;}}pp[0]=pp[1]=true;}int main(){int n,i,j,cnt,sum;getp();while(scanf("%d",&n),n){cnt=sum=0;for(i=0;i<pnum-1;i++){for(j=i+1;j<pnum;j++){if(p[i]+p[j]==n)cnt++;}}printf("%d\n",cnt);}return 0;} 
//机智的方法。
#include<stdio.h>#include<string.h>#include<math.h>#define N 10010bool p(int x){for(int i=2;i<=sqrt(x);i++)if(x%i==0)return false;return true;}int main(){int i,n,cnt;while(scanf("%d",&n),n){cnt=0;for(i=2;i<=n/2;i++){if(i!=(n-i)&&p(i)&&p(n-i))cnt++;}printf("%d\n",cnt);}return 0;}


0 0
原创粉丝点击