分拆素数和
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33016 Accepted Submission(s): 14296
Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30 26 0
Sample Output
3 2
解题思路:因为所给的被拆分的数字不大于10000,此时我们可以用素数筛选法求素数,提前打印素数表,如果x是素数,n-x也是素数,那么说明n就可以拆分成这两个素数相加,那么计数加1
题目代码如下:#include<iostream>using namespace std;int a[10000];void prime() //素数筛选法求素数,制作素数表{int i,j;memset(a,1,sizeof(a)); //提前将数组初始化为1,假设每一个数都是素数a[0]=0;a[1]=0;a[2]=0; //0,1,2不是素数,直接赋为0for(i=2;i<10000;i++) //筛选法求素数关键代码for(j=i+1;j<10000;j++){if(a[j]==0) //如果已经知道这个数不是素数了,结束本次循环continue;if(j%i==0) //如果发现这个数除了1和它本身之外有其他的因子,说明这个数不是素数,将这个数筛去a[j]=0;}}int main(){int n,num,i;prime(); //先调用函数讲0~10000间的素数全部求出while(cin>>n&&n){num=0;for(i=3;i<n-2;i++) //i从三开始是因为0,1,2不是素数直接排除,i<n-2是因为(0,n)(1,n-1)(2,n-2)这样的组合根本不可能存在{if(a[i]&&a[n-i]) //如果i是素数且n-i也是素数,素数对增加1.num++;}cout<<num/2<<endl; //例如10,可以分成(3,7)(7,3)但这只能算是一对,不能算两对,因此最终答案是num、2;}return 0;}