哥德巴赫猜想
//哥德巴赫猜想
/*
歌德巴赫猜想是对于任何大于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]]++;
}
}
}
}
/*
歌德巴赫猜想是对于任何大于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]]++;
}
}
}
}
逍遥地羊啊。。。。

浙公网安备 33010602011771号