#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;
}
验证歌德巴赫猜想(2021/1/16)
原创
©著作权归作者所有:来自51CTO博客作者高万禄的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
2024-1-16
摘要==内容
IT #include -
验证哥德巴赫猜想
强哥德巴赫猜想,先求出一定范围素数,再寻找两数之和
i++ #include #define -
编程验证哥德巴赫猜想
1、什么是哥德巴赫猜想在1742年给欧拉的信中哥德巴赫提出了以下猜想:任
哥德巴赫猜想 i++ System