I am a teacher!

导航

习题解析之:中国古代数学问题——二鼠打洞

【问题描述】

《九章算术》的盈不足篇里有一个很有意思的老鼠打洞问题。原文是这么说的:今有垣厚十尺,两鼠对穿。大鼠日一尺,小鼠亦一尺。大鼠日自倍,小鼠日自半。问:何日相逢?各穿几何?

这道题的意思是:有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打一尺,小老鼠也是一尺。大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。问它们几天可以相逢,相逢时各打了多少。

请编程求此题的解,要求使用循环来完成,不允许使用幂运算。

输入格式

输入为1个整数wall,代表墙的厚度,单位为尺。

输出格式

输出为两行,第一行输出1个整数,表示相遇时所需的天数

第二行输出 2 个数字,分别为小鼠和大鼠打洞的距离,单位为尺,若计算结果是浮点数保留小数点后 1 位数字。

示例 1

输入:

10

输出:

4

1.8 8.2

示例2

输入:

2

输出:

1

1 1

【编程思路】

        用变量 w 表示墙的厚度,s1和v1 表示大老鼠打墙的总厚度和大老鼠每天打墙的厚度,s2和v2 表示小老鼠打墙的总厚度和小老鼠每天打墙的厚度。 初始时有:

        s1,s2 = 0,0

        v1,v2 = 1,1

        当墙的厚度为2 时,1 天即可完成,大小老鼠均打墙 1 尺。输出为整数,属于一个特例。程序中先处理。

        大小老鼠打墙的过程用循环来处理。

        若当前墙的厚度 w 超过了大小老鼠每日打墙厚度之和,即 w > v1 + v2 时,两个老鼠得花 1 天时间打墙,并且还不能打穿,此时累加两个老鼠各自打墙的总厚度,s1 += v1,s2 += v2;同时修改两个老鼠下一天能打墙的厚度,v1 *= 2, v2 /= 2;两个老鼠打了一天的墙后,墙的厚度会变小,w = w - (v1 + v2)。若修改后的 w 仍超过了大小老鼠每日打墙厚度之和,则继续上述循环处理过程。

        若当前墙的厚度 w 不超过大小老鼠每日打墙厚度之和,即 w <= v1 + v2 时,此时上述循环结束。剩下的墙大小老鼠一天即可打穿,此时问题变成了一个相遇问题。按大小老鼠各自打墙的速度计算最后一天各自打墙的厚度。

【源程序】

        按照上述思路,编写的源程序如下:

image

 

posted on 2025-11-07 16:32  aTeacher  阅读(57)  评论(0)    收藏  举报