本篇文章讲解题目:蜗牛爬树
推荐先独立进行解题尝试,然后再阅读本篇讲解!
一道小学数学题,但对于计算机来说,却是直接模拟这一过程更为简洁。
很明显的一个思路是,对高度不断模拟上升下落的这一过程,然后统计次数,直到高度达到树的高度。
简单的画一个流程图:
分析可以发现,这里的循环是由一个条件控制的。如果满足某一条件则一直循环,否则退出循环。
在C语言里,这种形式可以使用while语句表达,其基本形式为:
while(/*条件*/) { /*语句*/ }
可以发现与if语句形式类似,也是很好理解,若满足条件,则不断执行语句,每次执行之后判断条件是否成立,然后选择继续执行或者跳出循环。
有了上面的基础知识,我们再来思考这道题,发现上面的程序流程图对于一些情况是没有考虑到的。
- 首先是Impossible不可能的情况,下降比上升的幅度还大,那么很显然是不可能的。但是有一种却要排除在外,也就是第一天白天就能够爬到树顶的情况,那么应该输出1。
- 考虑到如果白天就爬到,那么晚上就不用掉落,很显然我们在白天爬完之后应该判断,是否已经到了树顶,如果到了,那么就不需要晚上掉落这一部分了。
加上这些考虑,我们改进流程图如下:
有了这些思考,AC还是件难事吗-.-。
嗯……似乎还有些问题。
首先是对于输出不可能判定的条件有两个,在C语言里我们使用两个&号,也就是“&&”来表示并且,而用“||”来表示或者。这个条件就可以写为n<h&&n≤m。
再来是循环内的判断,如何终止循环呢?我们可以使用continue与break来控制循环。
continue的作用是跳过continue下面的部分直接回到循环条件那里判断是否需要进行下一次循环。
break的作用就是直接跳出循环。
测试代码:
#include<stdio.h> int main() { int T=10; while(T--) { /* if(T==5) continue; */ /* if(T==5) break; */ printf("%d\n",T); } return 0; }
这里还顺带写了while的一种常见用法while(T--),可先自己理解理解其中含义,在后面输入输出系列中会详细说明。
写到这里,这一题就算告一段落了。
事实上,while还有一种变形,do-while,其基本形式为:
do { /*语句*/ } while(/*条件*/);
也就是判断循环条件是否成立之前,先执行一次循环体,这在解决一些问题的时候很方便。
也许你可以自己尝试画出它的流程图呀~