今天来看一下二重哥德巴赫猜想,内容如下:
每个不小于6的偶数都可以表示为两个奇素数之和:即6=3+3,12=5+7…
分析一下:这个猜想可以理解为每个不小于6的偶数都可以由两个素数相加而来
OK,那么思路就有了:
第一步:判断用户输入的数字是不是大于6的偶数(这一步无关紧要),要设置用户退出程序的路径;
第二步:验证哥德巴赫猜想是否正确
第三步:验证这两个数是否为素数:若是:返回第二步,哥德巴赫猜想正确;若不是:返回第二步,哥德巴赫猜想错误
好了,下面给各位老爷们代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int isPrime(int n)//判断素数
{
int i;
int count;
count=sqrt(n);
if(n==2)
return 1;
if(n==1||n%2==0)
return 0;
for(i=2;i<=count;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int isRight(int num,int *a,int *b)//判断哥德巴赫猜想是否正确
{
int i;
int half;
half=num/2;
for(i=3;i<=half;i+=2)
{
if(isPrime(i)&&isPrime(num-i))
{
*a=i;
*b=num-i;
return 1;
}
}
return 0;
}
int main()
{
int num=0;
int a,b;
do
{
printf("请输入大于6的偶数(按下-1退出程序):\n");
scanf("%d",&num);
if(num>=6&&(num%2)==0)//判断是否渡河要求
{
if(isRight(num,&a,&b))//用函数判断正确错误
{
printf("哥德巴赫猜想是正确的!\n");
printf("%d=%d+%d\n",num,a,b);
}
else
printf("哥德巴赫猜想错误!\n");
}
else if(num==-1)
num=-1;
else
printf("输入数据不符合要求!\n");
}while(num!=-1);
return 0;
}
输出示例:
请输入大于6的偶数(按下-1退出程序):
120
哥德巴赫猜想是正确的!
120=7+113
请输入大于6的偶数(按下-1退出程序):...
代码比较简单,调用了两个函数(在isRight函数中嵌套使用了IsPrime函数)
可能比较疑问的地方是下面两行代码
int isRight(int num,int *a,int *b)----21行
if(isRight(num,&a,&b))-----47行
这个地方传入指针,其实为了引用,因为大家都知道,一个函数中最多只能return一个值,因为我们需要两个值:a,b,但是isRight函数不可能返回两个值,所以这地方就用了“引用”的方法,或者可以说成:让指针把我们需要的值带出来!
说到return的问题,再多说一点吧。
首先看我们的isPrime函数:
int isPrime(int n)
{
int i;
int count;
count=sqrt(n);
if(n==2)
return 1;
if(n==1||n%2==0)
return 0;
for(i=2;i<=count;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
整整用了四个return,这样也可以,编译器不会报错,因为这四个return相当于四扇门,而每个时刻只有一扇门是打开的。但是如果你的函数里面”门“多了就很有可能造成混乱!
下面用一个简单的代码演示如何解决(下面代码是判断一个数是否为偶数,很简单的问题,没必要和下面代码一样麻烦,这里用这么长的代码去判断只是为了说明一下return的问题):
#include <stdio.h>
#include <stdlib.h>
int even(int num)
{
if(num%2==0||num==0)
return 1;
else
return 0;
}
int main()
{
int num;
scanf("%d",&num);
int judge;
judge=even(num);
if(judge==1)
printf("%d是偶数!",num);
else
printf("%d不是偶数!",num);
return 0;
}
在even函数中也是用来两个return,按照规范是不可以的,但是可以将even函数改成下面代码:
int even(int num)
{
int i=0;
if(num%2==0||num==0)
i=1;
else
i=0;
return i;
}
这样整个函数就只有一个return 了,就符合规范啦!