哥德巴赫猜想

//哥德巴赫猜想
/*

歌德巴赫猜想是对于任何大于4的正整数,可以分解成两个质数和的形式
例如 4=2+2,5=2+3;
现在你的任务是 给你一个正整数N(N<=32768),求出这个数能够分解成多少组上述形式。
例如 例如 5只能分解成 2+3,我们认为 2+3 与3+2  是一样的,所以它只能分成一组上述形式。
再例如 14=3+11,14=7+7,可以分解成两种不同的形式。有多组测试数据,直到N=0结束。

样例输入

4
5
14

样例输出

1
1
2

*/
#include
<iostream>
using namespace std;
int x[32768];//x所存为筛法求质数的结果,即标记为0的为质数 
int p[3513];
int g[32769];
void initX();
void initG();
int main(){
    initX();
//初始化 32768内的质数 
    initG();//初始化 哥德巴赫 数组  
    int n;
    
//初始化数组 
    while(scanf("%d",&n)!=EOF){
        
if(n==0)break;//输入0退出 
      printf("%d\n",g[n]);
    }
}

void initX(){//初始化 筛法求质数的结果
    int temp;
    
for(int i=0;i<32768;i++){
       x[i]
=0;
       g[i]
=0;
   }    
   g[
32768]=0;//x比g大1; 
    
//初始化数组完成 
    /*
    预计结果,
    数组中质数为0,其它为1 
    
*/
    x[
0]=x[1]=1;//因为 0和1不能通过计算得到,所以只能手工置1 ,1即不是合数也不是质数 
    for(int i=2;i<32768;i++){//循环数组中的每个数 
        if(x[i]==0){//如果该数所存的值为0,即第一次接触此数 
           temp=2*i;//将它的二倍,及n倍(要小于100000) ,都置为1,因为这些数都能被i整除 
           while(temp<32768){
                 x[temp]
=1;             
                 temp
+=i;
           }
        }
    }
    
//以下是将所有毒数存在一个数组p中 
    int pi=0;
    
for(int i=2;i<32768;i++){
        
if(!x[i]){
            p[pi]
=i;
            pi
++;
        }
    }
    
//cout<<pi;这里输出得到了一个数,就是3512,也就是 32768内的素数的个数,这个在下面用到 
}
void initG(){
    
for(int i=0;i<3513;i++){
        
for(int j=i;j<=3513;j++){
            
//起泡法将素数一一对应,如果外层为3里层为11则将g[4+11] ++  ,  然后到外层里层都是7的时候
            
//又将g[7+7] ++于是,g[14] 存的就是质数相加的种类了 
                if(p[i]+p[j]<32769&&p[i]<=p[j]){
                    g[p[i]
+p[j]]++;
                }
        } 
    }    
}
posted @ 2008-07-25 23:33  tiny羊  阅读(386)  评论(0)    收藏  举报