首页 > 代码库 > hdu2098分拆素数和(读题很重要!!!)

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 }

 

hdu2098分拆素数和(读题很重要!!!)