分拆素数和
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 48614 Accepted Submission(s): 21227
Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30
26
0
Sample Output
3
2
题意:给出一个偶数,问把这个偶数拆成两个不同素数相加和,有多少种方法。
题解:把偶数前面的素数都算出来保存在数组里,之后每种可能都试一下。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int a[5500]; 5 int num; 6 int isPrime(int n) 7 { //返回1表示判断为质数,0为非质数,在此没有进行输入异常检测 8 double n_sqrt; 9 if(n==2 || n==3) return 1; 10 if(n%6!=1 && n%6!=5) return 0; 11 n_sqrt=floor(sqrt((double)n)); 12 for(int i=5;i<=n_sqrt;i+=6) 13 { 14 if(n%(i)==0 | n%(i+2)==0) return 0; 15 } 16 return 1; 17 } 18 void prime() 19 { 20 num=0; 21 for(int i=2;i<=n;i++) 22 { 23 if(isPrime(i)) 24 { 25 a[num++]=i; 26 } 27 } 28 } 29 int main() 30 { 31 32 while(~scanf("%d",&n),n) 33 { 34 memset(a,0,sizeof(a)); 35 prime();int ans=0; 36 for(int i=0;i<num;i++) 37 { 38 for(int j=i+1;j<num;j++) 39 { 40 if(a[i]+a[j]==n) 41 { 42 //printf("%d %d ",a[i],a[j]); 43 ans++; 44 } 45 } 46 } 47 printf("%d ",ans); 48 } 49 return 0; 50 }