龙空技术网

用C语言实现“龟兔赛跑”的判断,这是一道非常有意思的编程题

小萌九尾 234

前言:

而今各位老铁们对“c语言程序题怎么做”大体比较着重,朋友们都想要剖析一些“c语言程序题怎么做”的相关内容。那么小编在网络上收集了一些有关“c语言程序题怎么做””的相关文章,希望大家能喜欢,咱们快快来了解一下吧!

今天我遇到了一道比较有意思的题目,正如我标题中所讲,“龟兔赛跑”。

龟兔赛跑的故事大家都不陌生吧,这道题是收录在PAT中的基础编程题目里的,显然,这是一道非常基础的编程题。

具体题目要求为:一只乌龟与一只兔子比赛跑步,从同一起点同一时刻出发,兔子呢骄傲自大,自认为自己必定能赢过乌龟,于是乎,它便跑10分钟回头看一看乌龟跑到哪里了,如果它跑得比乌龟快,它就会原地休息30分钟,否则呢,它就会继续再跑10分钟,然后再与乌龟进行比较,而乌龟很清楚自己跑得比较慢,于是它一停不停地跑啊跑,请问,跑了T分钟之后,究竟是乌龟跑得快呢,还是兔子跑得快,还是两个跑的一样快。

如果乌龟跑得快,则输出@_@+路程,如果是兔子跑得快,则输出^_^+路程。

如果两者跑得一样快,则输出-_-+路程。

乌龟的速度是3米每分钟,而兔子的速度是9米每分钟。

在做编程题的时候,我一贯的想法就是先理顺逻辑。

1、给定时间T,再进行判断,这也意味着时间T是需要我们自己在程序中输入的。

2、很容易理解的是,乌龟一直在跑,所以它的路程是恒定的,也就是3T。

3、接下来最难理解的就是兔子跑的路程,我先吐槽一句,兔子也太骄傲自大了,哈哈。

针对兔子跑的路程,我们这样分析:

从起始点开始,同一时间出发,那兔子与乌龟跑了10分钟之后,兔子的路程为90米,乌龟的路程为30米,显然兔子比乌龟快,那这个时候呢,兔子就要休息30分钟,休息30分钟之后呢,乌龟不停地在跑,它的路程这时变为120米,而兔子就继续跑10分钟,之后以此类推重复。

如图所示:

所以,总的时间是在流逝的,单纯用9T肯定是行不通的,那就得从0开始,毕竟在T=10的时候,兔子已经要休息了。

所以我就在思考,兔子的距离其实分为两段,一段是跑步的,一段是不跑的。

就要分开来实现,具体是用到一个标记法,我之后在代码实现中会讲到。

流程图

流程图是非常简单的,就很简单的一个流程形式走下来,计算乌龟和兔子各自跑过的距离,然后进行比较,输出不同的对应的结果即可。

代码实现

理顺逻辑给出流程图之后,接下来所对应的就是代码实现了。

1、给定时间T,主要是用到scanf输入。

2、兔子的距离计算,我说过,兔子跑过的路程是会实时发生变化的,不是说给定T为多少,它的距离就为多少。

那么,这里最好用到的就是标记法,我们可以对兔子休息状态和奔跑状态下分别进行标记。

比方说给定标记sign=0,此时兔子的状态就是奔跑状态,而兔子休息状态下sign=30,就意味着它要休息30分钟。

3、奔跑状态好理解,那休息状态呢,是如何达到的,这里涉及到两个条件判断了。

第一个条件判断:兔子要在奔跑状态下,且过10分钟之后它要看看乌龟,这里很明显兔子在第十分钟的时候就回头瞅乌龟去了。

第二条件判断:兔子跑过的距离要大于乌龟,否则它就不会休息继续跑10分钟。

话不多说,给出代码:

#include<stdio.h>int main(){    int T = 0;    int tortoise = 0;    int rabbit = 0;    int sign = 0;//做标记,也就是标记兔子现在是跑步的状态还是休息的状态    //默认sign=0是跑步的状态,默认sign=1是休息的状态    scanf("%d", &T);    tortoise = 3*T;//乌龟的速度是一直不发生变化的,所以默认为3T    //重点是兔子跑的路程,不能是简单的9T,因为兔子还有休息时间    //注意,兔子是从最开始开始跑的,所以要用一个for循环来代替    //每跑10分钟回头看一看乌龟,意思就是每10分钟要挑出来,那么一个for循环是最好的    for(int i=1; i<=T; i++){//从0开始,到10为止,然后就要休息了        //所以在for循环里只需要判断是否为10的倍数即可,就是除以10取余为0        if(sign == 0){            rabbit = rabbit+9;//兔子跑过的距离,所以乌龟也是同理的        }        else{            sign = sign - 1;        }        if(i%10==0&&sign==0){//跑10分钟和乌龟进行比较            if(rabbit>=tortoise){                sign = 30;//兔子休息30分钟            }        }    }    if(rabbit>tortoise){        printf("^_^");        printf(" %d", rabbit);    }    else if(tortoise>rabbit){        printf("@_@");        printf(" %d", tortoise);    }    else if(tortoise==rabbit){        printf("-_-");        printf(" %d", rabbit);    }}

可是我按照这样的逻辑去写,最后得到的测试结果与我想象中的大相径庭,完全不一样。

理论上来说,当T=30的时候,兔子与乌龟应该是平局才对。

PAT平台测试结果如下:

显然是存在以下三个问题:

1、sample乌龟赢答案错误。

2、奔跑中平局错误。

3、睡觉中平局错误。

解决过程

于是呢,针对这三个问题,我一个一个进行排查,毕竟我想把这道题目完整做出来。

我发现,在最开始的时候,我就写了一个tortoise = 3*T

问题就出在这条语句上,我是把这条语句写在循环外的,这样就会造成一个后果,导致乌龟的路程从始至终都是确定的。

而要改变兔子是休息状态还是跑步状态,是要与乌龟的实时路程进行比较的。

也就是:

        if(i%10==0&&sign==0){//跑10分钟和乌龟进行比较            if(rabbit>tortoise){                sign = 30;//兔子休息30分钟            }        }

当然,我也把rabbit>tortoise改为rabbit>=tortoise过,但这样只能再多拿两分,也就是把睡觉中平局给实现了。

显然这样是不行的,于是我就把那部分乌龟的路程放到for循环中。

这样得到的就是乌龟的实时路程了!

最终正确的代码实现

#include<stdio.h>int main(){    int T = 0;    int tortoise = 0;    int rabbit = 0;    int sign = 0;//做标记,也就是标记兔子现在是跑步的状态还是休息的状态    //默认sign=0是跑步的状态,默认sign=1是休息的状态    scanf("%d", &T);       //重点是兔子跑的路程,不能是简单的9T,因为兔子还有休息时间    //注意,兔子是从最开始开始跑的,所以要用一个for循环来代替    //每跑10分钟回头看一看乌龟,意思就是每10分钟要挑出来,那么一个for循环是最好的    for(int i=1; i<=T; i++){//从0开始,到10为止,然后就要休息了        tortoise = tortoise+3; //乌龟的速度是一直不发生变化的,所以默认为3T        //所以在for循环里只需要判断是否为10的倍数即可,就是除以10取余为0        if(sign == 0){            rabbit = rabbit+9;//兔子跑过的距离,所以乌龟也是同理的        }        else{            sign = sign - 1;        }        if(i%10==0&&sign==0){//跑10分钟和乌龟进行比较            if(rabbit>tortoise){                sign = 30;//兔子休息30分钟            }        }    }    if(rabbit>tortoise){        printf("^_^");        printf(" %d", rabbit);    }    else if(tortoise>rabbit){        printf("@_@");        printf(" %d", tortoise);    }    else if(tortoise==rabbit){        printf("-_-");        printf(" %d", rabbit);    }}
测试结果总结

别看“龟兔赛跑”很有意思,但难度也是同时存在的,在做这道题的时候,还是要特别注意,逻辑是一定一定要理顺的,不理顺寸步难行。

标签: #c语言程序题怎么做