前言:
而今各位老铁们对“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语言程序题怎么做