1. 程式人生 > >hdu2098分拆素數和(讀題很重要!!!)

hdu2098分拆素數和(讀題很重要!!!)

output sca namespace bmi i++ text put esc cnblogs

分拆素數和

題目鏈接: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分拆素數和(讀題很重要!!!)