Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30 26 0
Sample Output
3 2//素数筛选法 #include<iostream> #include<cstring> #include<cstdio> #include<math.h> #define MAX 10000 using namespace std; int shaixuan(int p[MAX],int n) { //int p[100]; p[0]=0; p[1]=0; int i,j; for(i=2;i<n;i++) { p[i]=1; } // //for(int i=1;i<10;i++) //{ // cout<<p[i]<<" "; //} for(i=2;i<sqrt(n);i++) { if(p[i]) { for(j=i*i;j<n;j += i) { p[j]=0; } } } //for(int i=1;i<n;i++) //{ // if(p[i]==1) // { // cout<<i<<endl; // } // } } int main() { int p[MAX]; int num; int i; //cin>>num;//输入我想筛选的素数 //shaixuan(p,num); for(;;) { cin>>num; if(num==0) break; else { int count=0; shaixuan(p,num); for(i=2;i<num/2;i++) { // if(p[i]&&p[num-i-1]) // { // count++; // } if(p[i]&&p[num-i]) { // cout<<i<<endl; if(i!=num-i) { count++; } } } cout<<count<<endl; } } }
//以上为AC的满分程序,是通过 Eratosthenes筛选法 筛选的,将其不为素数的值标记为0//为素数的值标记为1 ,最后注意 在主函数循环中 遍历的是 num/2 而不是num