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