APP下载

Python求解“鸡兔同笼”升级版

2020-01-13牟晓东

电脑报 2020年46期
关键词:鸡兔同笼数目语句

牟晓东

“鸡兔同笼”趣题最早记载于1500多年前的中国古代数学著作《孙子算经》中的“卷下”第31题(后传至日本演变为“鹤龟算”),原题为:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”意思是“鸡和兔的总头数是35,总脚数是94,鸡和兔各有几只?”。

1.问题求解

假设鸡有x只,兔有y只,根据题意列方程为:

x+y=35,2x+4y=94。

求解,得:x=23,y=12;即鸡有23只(46只脚)、兔有12只(48只脚)。

2.Python编程求解

如果使用Python语言来编写程序的话,可使用for循环、range()函数和if条件判断来完成。先使用“heads = 35”和“feet = 94”两个赋值语句,保存鸡和兔的总头数和总脚数;接着使用range()函数进行for循环,让鸡的数目从1开始计数加1循环,循环体中的if条件为“2*x + 4*y == feet”,即“鸡数目的两倍加兔数目的四倍之和等于总脚数”,条件成立的话,使用print语句进行最终鸡兔数目的输出。保存程序为“鸡兔同笼1.py”,运行结果显示为“鸡有 23 只,兔有 12 只。”(如图1)。

3.升級版的“鸡兔同笼”

考虑到“鸡兔同笼”原题中所给出的总头数和总脚数是固定的35和94,因此最终的求解也是固定的“23只鸡、12只兔”。如果将题目进行“升级”,鸡和兔的总头数与总脚数均由用户从键盘输入,仍然来求鸡和兔的数目,应该如何编写程序代码呢?

首先使用标准输入函数input来接收用户从键盘上输入的信息,比如“heads = input('请输入鸡和兔的总头数:')”和“feet = input('请输入鸡和兔的总脚数:')”。但在此需要特别注意的是,Python的input函数接收到的输入数据是str字符串(虽然表面上看是数字),必须要使用int来转换成整数型才能进行数学运算,语句为“heads = int(heads)”和“feet = int(feet)”。

接下来仍然是使用range()函数进行for循环:“for x in range(0,(heads+1))”。此时要充分考虑到用户所输入数据的计算结果,很有可能会出现“只有鸡”或“只有兔”的情况。举例:用户输入的总头数是10、总脚数是20,运算结果就应该是“10只鸡、0只兔”;或输入总头数是10、总脚数是40,运算结果则是“0只鸡、10只兔”。因为在计算机编程语言中,数字0总是被看作是最起始的值,Python的列表、字符串和元组等的元素均是从0开始进行索引的。不管是“0只鸡”还是“0只兔”,在计算机看来,这都是“鸡兔同笼”,只不过数目是0而已。另外,由于range()函数的两个参数是“左闭右开”型的区间,即第一个参数是被计算在内,而第二个参数却是不包括在内的(只计算到它的前一个元素);所以,第二个参数应该设置为“heads+1”,这样就能在循环时计算到它的前一个元素(即“heads”),也就是“0只兔”的情况(“x=0”则是“0只鸡”)(如图2)。

循环体与之前类似,仍然是if条件判断“2*x + 4*y == feet”是否成立,成立的话则使用print输出结果,然后使用break语句跳出循环。因为不确定用户从键盘上输入的两个数据是否恰好为“有效解”——鸡和兔的数目必须是整数只,所以在循环体外应该再添加一个“if 2*x + 4*y != feet”判断语句,将这种无法进行整数结果计算的情况进行提示:“输入的总头数和总脚数不合法”。没有该print语句的话,程序也能正常运行,但对于这种“意外”没有任何提示,程序缺少必要的友好性(如图3)。

最后将程序保存为“鸡兔同笼2.py”,运行几次进行测试,输入的总头数和总脚数包括原题目中的“35、94”、鸡兔各为0只、“30、110”四种合法数值,程序均输出了正确的计算结果;最后一个测试输入“8、100”,结果就提示“输入的总头数和总脚数不合法”(如图4)。

猜你喜欢

鸡兔同笼数目语句
“鸡兔同笼”问题解法探析及思考
移火柴
鸡兔同笼
从“鸡兔同笼”谈数学的核心素养
牧场里的马
基本算法语句
我可以运用公式解决“鸡兔同笼”问题
我喜欢
作文语句实录
探索法在数学趣题中的应用