hdu2098分拆素數和(讀題很重要!!!)
阿新 • • 發佈:2017-05-28
output sca namespace bmi i++ text put esc cnblogs
Sample Input
30
26
0
分拆素數和
題目鏈接: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
Input 輸入包含一些正的偶數,其值不會超過10000,個數不會超過500,若遇0,則結束。
Output 對應每個偶數,輸出其拆成不同素數的個數,每個結果占一行。
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分拆素數和(讀題很重要!!!)