码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-05-28 20:11:59      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:结束   check   mit   ++   include   mis   script   scan   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分拆素数和(读题很重要!!!)

标签:结束   check   mit   ++   include   mis   script   scan   hdu2098   

原文地址:http://www.cnblogs.com/l9987/p/6916470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!