验证歌德巴赫猜想(2021/1/16)

在这里插入图片描述

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
//验证任意大于2的偶数都可以表示成两个素数之和

//判断一个数是否为素数
/*算法流程:试除法 
用 2、3、4、...、sqrt(n)去除n
如果能被整除则为合数
不能整除则为素数 
*/
bool judge(int n){
	//先对n进行判断
	if(n<=1){
		return 0;
	}
	if(n==2){
		return 1;
	}
	//开始迭代判断
	int i=2;
	int sqrt_n=(int)sqrt((double)n);
	for(i=2;i<=sqrt_n;++i){
		if(n%i==0){
			return 0;
		}
	}
	return 1;
}
//验证猜想_1 
void function_1(void){
	int i,n;
	for(i=4;i<=2000;i+=2){//从4开始验证 
		//将i分解为两个数、这两个数的和等于i
		for(n=2;n<i;n++){//最小的素数为2、从2开始遍历 
			//判断n是否为素数
			if(judge(n)){//n为素数 
				//求出另一个加数
				if(judge(i-n)){//得到一对符合要求的素数 
					cout<<i<<":\n";
					cout<<"\t "<<n<<" "<<i-n<<endl; 
					//对偶数 i 验证成功
					break; 
				} 
			}
		}
		//如果上面的循环体结束后,i==n则对i没有验证成功 
		if(i==n){
			cout<<"Error: "<<i<<endl; 
		} 
	}
}
//验证猜想_2
void function_2(){
	int i,n;
	for(i=4;i<=2000;i+=2){//从4开始验证 
		//将i分解为两个数、这两个数的和等于i
		for(n=2;n<=i/2;n++){//最小的素数为2、从2开始遍历 
			//判断n是否为素数
			if(judge(n)){//n为素数 
				//求出另一个加数
				if(judge(i-n)){//得到一对符合要求的素数 
					cout<<i<<":\n";
					cout<<"\t "<<n<<" "<<i-n<<endl; 
					//对偶数 i 验证成功
					break; 
				} 
			}
		}
		//如果上面的循环体结束后,i==n则对i没有验证成功 
		if(i==n){
			cout<<"Error: "<<i<<endl; 
		} 
	}
} 

//验证猜想_3
void function_3(void){
	//我们可以申请一个表
	int* list=(int*)malloc(sizeof(int)*(2001));//第1个空间不使用
	int i=2;
	for(i=2;i<=1999;++i){
		if(judge(i)){
			list[i]=1;
		}else{
			list[i]=0;
		}
	}
	//进行验证
	int n;
	for(i=4;i<=2000;i+=2){//从4开始验证 
		//将i分解为两个数、这两个数的和等于i
		for(n=2;n<=i/2;n++){//最小的素数为2、从2开始遍历 
			//判断n是否为素数
			if(list[n]&&list[i-n]){//n为素数 
				cout<<i<<":\n";
				cout<<"\t "<<n<<" "<<i-n<<endl; 
				//对偶数 i 验证成功
				break; 
			}
		}
		//如果上面的循环体结束后,i==n则对i没有验证成功 
		if(i==n){
			cout<<"Error: "<<i<<endl; 
		} 
	}
	//释放申请的内存空间
	free(list); 
} 
int main(int argc,char**argv){
	function_1();
	//可见验证猜想是成功的
	//怎样进一步优化算法
	//(1)偶数的分解存在重复
	/*
	i=4 (2*,2) |(3,1)
	i=6 (2,4) (3*,3) (4,2) |(5,1)
	i=8 (2,6) (3,5) (4*,4) (5,3) (6,2) |(7,1)
	有规律可见,除最后一项、从i/2开始出现对称性重复 
	而且最后一项我们会发现、1不是素数。所以我们可以完全不验证最后一项 
	*/
	function_2();
	//可见我们也完美的进行了验证
	
	//怎样再优化?
	//我们可以知道、judge函数调用了不少次呢?
	//而且judge函数作用被重复调用
	function_3(); 
	cout<<"Donald Ervin Knuth 说 \"程序是蓝色的诗!\""<<endl;
	cout<<"持之以恒地学习,没有什么是学不会的,行动起来,没有什么不可以。"; 
	cout<<"趁着年轻加油吧小伙子!实现自己地梦想、而不是将来的上班下班吃饭睡觉上班下班......";
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高万禄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值