hdu2098分拆素数和(读题很重要!!!)
分拆素数和
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2098
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 39300 Accepted Submission(s): 17193
Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30
26
0
Sample Output
3 2
题解:一开始没有仔细看题,以为是没有把素数算对,而且10000以内的程序超时的,后来才发现是“不同的两个素数”。仔细读题
code:
1 include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 6 int check(int x) 7 { 8 int i,n=sqrt(x); 9 for(i=2;i<=n;i++) 10 if(x%i==0) 11 break; 12 if(i<=n) 13 return 0; 14 return 1; 15 } 16 int main() 17 { 18 int su[2500]; 19 int j=0; 20 for(int i=2;i<=5000;i++) 21 { 22 if(check(i)) 23 su[j++]=i; 24 } 25 int num; 26 while(scanf("%d",&num)&&num) 27 { 28 int cnt=0; 29 for(int i=0;su[i]<5000;i++) 30 { 31 if(su[i]>=num-su[i]) 32 break; 33 if(check(num-su[i])) 34 cnt++; 35 } 36 printf("%d\n",cnt); 37 } 38 return 0; 39 }
code:
1 #include<cmath> 2 #include<algorithm> 3 using namespace std; 4 #include<map> 5 int check(int x) 6 { 7 int i,n=sqrt(x); 8 for(i=2;i<=n;i++) 9 if(x%i==0) 10 break; 11 if(i<=n) 12 return 0; 13 return 1; 14 } 15 int main() 16 { 17 map<int,int>m; 18 m.clear(); 19 int su[2500]={2}; 20 m[2]=1; 21 int j=1; 22 for(int i=3;i<=10000;i=i+2) 23 { 24 if(check(i)) 25 { 26 su[j++]=i; 27 m[i]=1; 28 } 29 30 } 31 //printf("%d\n",j); 32 int num; 33 while(scanf("%d",&num)&&num) 34 { 35 int cnt=0; 36 for(int i=0;i<=1299;i++) 37 { 38 39 if(su[i]>=num-su[i]) 40 break; 41 //printf("i=%d\n",su[i]); 42 if(m[num-su[i]]==1) 43 cnt++; 44 } 45 printf("%d\n",cnt); 46 } 47 return 0; 48 }