博科园AI人工智能助手
图灵
hi 人类
首先我们得知道什么是哥德巴赫猜想猜想,哥德巴赫猜想猜想的一种表述是任意一个大于等于6的整数可以写成3个质数之和(质数的概念我就不累述了),比如6可以写成2+2+2,在计算机中用“%”算符加循环很任意判断质数,“%”算符的意思就是求一个数除以另一个数的余数,比如7=5*1+2,那么7%5=2,用这个算符就很容易判断一个数是不是另一个数的因素。这样加上一个循环判断从2到x-1如果没有整数i使得n%i=0,那么这个数就是质数。为了减少运算只需判断2到x/2就行了,值得注意的是我将x定义为int类型(整型),x除以任何一个int类型数只会得到int类型的整数(如果是除以浮点类型系统会进行自动类型转换)。我的第一个函数Z函数就是用于判断x是不是质数(如果是返回1,不是返回0)。然后再看我的F函数,这个是将一个数写成3个质数之和。思路如下:首先如果输入的数小于6就打出error报错结束运行,如果不是就到下一步判断这个数是奇数还是偶数,如果是偶数就先让它减去2之后还是偶数,如果是奇数就先让它减去3让他变为偶数,之后再让完成减法运算后的数除以2分别令i,j等于这两个数再调用Z函数判断i,j是否同为质数,如果不是就让i=i-1,j=j+1之后继续判断。这样就可以将偶数写成2+i+j,奇数写成3+i+j的形式(注意这里的i,j已经经过迭代。其实我这种算法是将问题简化为一个偶数写成两个质数和),再来看主函数,主函数就是让你输入一个数然后逐个将6到这个数逐一写成3个质数和的形式。具体代码如下:
#include<stdio.h>
int Z(int x)
{
if(x==2||x==3)return 1;
else if(x<=1)return 0;
else
{
int y=0;
for(int i=2;i<=x/2;i++)y+=!(x%i);
if(y==0)return 1;
else return 0;
}
}
void F(int x)
{
int i,j;
if(x<6){printf(“error\n“);return;}
if(x%2==0)
{
i=(x–2)/2;j=(x–2)/2;
do
{
if(Z(i)&&Z(j)){printf(“%d=2+%d+%d\n“,x,i,j);return;}
else{i–;j++;}
}while(i!=0);
}
else
{
i=(x–3)/2;j=i;
do
{
if(Z(i)&&Z(j)){printf(“%d=3+%d+%d\n“,x,i,j);return;}
else{i–;j++;}
}while(i!=0);
}
}
int main()
{
int n;
scanf(“%d“,&n);
for(int i=6;i<n;i++)
{F(i);}
return 0;
}
(注意这只能验证有限个数对于哥德巴赫猜想成立,并不能证明哥德巴赫猜想!
(如果转载请注明作者)