哥德巴赫猜想以及函数的返回值问题

今天来看一下二重哥德巴赫猜想,内容如下:
每个不小于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)----21if(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 了,就符合规范啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

致虚守静~归根复命

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

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

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

打赏作者

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

抵扣说明:

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

余额充值