描述
中国古代《周髀算经》、《九章算术》和《孙子算经》等数学著作中记载了很多有趣的数学问题,其中很多题目非常适用于计算机求解,下面给出几个有趣的问题。
- 鸡兔同笼
大约在1500年前,《孙子算经》中就记载了这个有趣的问题。书中是这样叙述的:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?这四句话的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?
请编一个程序,用户在同一行内输入两个整数h和f(两数之间用空格隔开),代表头和脚的数量,编程计算笼中各有多少只鸡和兔。假设鸡和兔都正常,无残疾。若有解则按照“有c只鸡,r只兔”的格式输出解;若无解则输出“Data Error!”
2.物不知数
“物不知数”出自《孙子算经》。题目为“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”意思是说有一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;7个7个数也会多出2个。
请编写一个程序,读入一个正整数n,计算并输出不超过输入数字n且满足条件的物品个数(有多个解时,按从小到大的顺序每个解占一行)。如无解则不输出。
3.二鼠打洞
《九章算术》的“盈不足篇”里有一个很有意思的老鼠打洞问题。原文这么说的:今有垣厚十尺,两鼠对穿。大鼠日一尺,小鼠亦一尺。大鼠日自倍,小鼠日自半。问:何日相逢?各穿几何?这道题的意思就是说,有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打一尺,小老鼠也是一尺。大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。问它们几天可以相逢,相逢时各打了多少。(要求使用循环完成,不允许使用幂运算)
请编写程序,读入1个正整数,代表墙的厚度,单位为尺;计算并输出两鼠相遇所需天数以及相遇时各自打墙厚度。输出分两行,第一行输出1个整数,表示相遇时所需的天数;第二行输出用空格分隔的2个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,保留小数点后1位数字。
4.李白买酒
大诗李白,一生好饮酒。一天,他提着酒壶,从家里出来,酒壶中有酒若干。他边走边唱:无事街上走,提壶去买酒,遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒,计算并输出壶中原有酒几斗?
5. 宝塔上的琉璃灯
有一座八层宝塔,每一层都有一些琉璃灯,每一层的灯数都是上一层的二倍,已知共有765盏琉璃灯,计算并输出每层各有多少盏琉璃灯。输出分八行(1~8行),分别说明相应层上琉璃灯的数目,具体输出内容和格式见下面的说明。
输入输出格式说明
第一行输入一个字符串,若为”鸡兔同笼”、”物不知数”、”二鼠打洞”、”李白买酒”、”宝塔上的琉璃灯”五种之一,则调用相应程序处理中国古代数学问题;若不是,则直接打印’输入错误’并结束程序。
(1)当第一行输入“鸡兔同笼”时,第二行输入以空格分隔的两个整数h和f,h代表鸡兔的总头数,f代表鸡兔的总脚数。
若有解则按照“有c只鸡,r只兔”的格式输出解;若无解则输出“Data Error!”
(2)当第一行输入“物不知数”时,第二行输入一个正整数n(题目保证是正整数)。
计算并输出不超过输入数字n且满足条件的物品个数(有多个解时,按照从小到大的顺序、每个解占一行)。如无解则不输出。
(3)当第一行输入“二鼠打洞”时,第二行输入一个正整数w(题目保证是正整数)代表墙的厚度,单位为尺。
输出分两行,第一行输出1个整数,表示相遇时所需的天数;第二行输出用空格分隔的2个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,要求保留小数点后1位数字。
(4)当第一行输入“李白买酒”时,直接输出李白酒壶中原有酒几斗?
(5)当第一行输入“宝塔上的琉璃灯”时,输出共八行(1~8行),每一行都是一个字符串,第i行输出“第i层上有p只琉璃灯”。
(6)输入“猴子吃桃”,计算并输出第1天摘了多少桃。
()
示例 1
输入:
鸡兔同笼
35 94
输出:
有23只鸡,12只兔
示例2
输入:
鸡兔同笼
35 140
输出:
有0只鸡,35只兔
示例3
输入:
鸡兔同笼
100 5
输出: Data Error!
示例4
输入:
物不知数
200
输出: 23 128
示例5
输入:
二鼠打洞
10
输出:
4 1.8 8.2
示例6
输入:
割圆法求圆周率
输出:
输入错误
# ------------ ------- -------- ----------- -----------
# @File : 4.4.1 中国古代数学问题.py
# @Contact : vasp@qq.com
# @Copyright : 2018-2025, Wuhan University of Technology
# @Modify Time: 2021/4/26 11:53
# @Author : 赵广辉
# @Version : 1.0
# @License : 仅限用于Python程序设计基础实践教程(赵广辉,高等教育出版社)配套实验
# ------------ ------- -------- ----------- -----------
def type_judge(question):
"""接收一个字符串为参数,根据参数调用不同函数执行不同代码。
这种写法不规范,但把输入、输出都放在一个函数中,方便管理。
"""
if question == '鸡兔同笼':
chicken_rabbit() # 用户输入为'鸡兔同笼'调用此函数
elif question == '物不知数':
amount_of_goods() # 用户输入为'物不知数'调用此函数
elif question == '二鼠打洞':
two_mice() # 用户输入为'二鼠打洞'调用此函数
elif question == '李白买酒':
libai_buy_wine() # 用户输入为'李白买酒'调用此函数
elif question == '宝塔上的琉璃灯':
lamp_on_pagoda() # 用户输入为'宝塔上的琉璃灯'调用此函数
elif question == '猴子吃桃':
monkey_peach()
else:
print('输入错误')
def chicken_rabbit():
"""
在同一行内输入用空格分隔的两个整数,代表头和脚的数量,计算并输出笼中各有多少只鸡和兔,
如无解则输出“Data Error!”,函数无返回值。
输入:35 94
输出:有23 只鸡,12 只兔
输入:100 5
输出:Data Error!
"""
head, foot = map(int, input().split())
if (foot - head * 2) % 2 == 0 and foot - head * 2 >= 0 and head >= 0 and foot >= 0:
chicken = head - (foot - head * 2) // 2
rabbit = (foot - head * 2) // 2
print(f'有{chicken}只鸡,{rabbit}只兔')
else:
print('Data Error!')
def monkey_peach():
num = 1 # 最后一天桃子数
for i in range(9):
num = (num + 1) * 2 # 前一天桃子数
print(num) # 第一天桃子数
def amount_of_goods():
"""一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;
7个7个数也会多出2个。输入一个正整数,从小到大依次输出所有不超过输入数字
且满足条件的物品数量,有多个答案时每行输出一个。
例如输入:200
输出:
23
128
"""
n = int(input())
for i in range(n):
if i % 3 == 2 and i % 5 == 3 and i % 7 == 2:
print(i)
def two_mice():
"""有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打洞一尺,小老鼠也是打洞一尺。
大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。计算并输出它们几天可以相逢,
相逢时各打了多少尺。
输入格式:输入1 个整数,代表墙的厚度,单位为尺
输出格式:
第一行输出1 个整数,表示相遇时所需的天数
第二行输出2 个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,保留小数点后1 位数字。
"""
n = int(input())
rat, mouse, day, time = 1, 1, 0, 1
distance_of_rat, distance_of_mouse = 0, 0
while n > 0:
if n - mouse - rat < 0:
time = n / (mouse + rat)
n = n - mouse - rat
distance_of_mouse = distance_of_mouse + time * mouse
distance_of_rat = distance_of_rat + time * rat
rat = 2 * rat
mouse = mouse / 2
day = day + 1
print(day)
print(round(distance_of_mouse, 1), round(distance_of_rat, 1))
def libai_buy_wine():
"""大诗人李白,提着酒壶,从家里出来,酒壶中有酒若干。他边走边唱:无事街上走,提壶去买酒,
遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒,计算并输出壶中原有酒几斗?
"""
wine = 0 # 第五次遇花时剩1斗
for i in range(5):
wine = wine + 1 # 每次遇花喝1斗,酒原数量应+1
wine = wine / 2 # 每次遇店后酒量加一半,遇店前酒为当前的二分之一
print(wine)
def lamp_on_pagoda():
"""有一座八层宝塔,每一层都有一些琉璃灯,每一层的灯数都是上一层的二倍,
已知共有765 盏琉璃灯,计算并输出每层各有多少盏琉璃灯。
输出为8行,从上往下数字依次增大。
"""
for x in range(1, 768):
if sum([x * 2 ** i for i in range(8)]) == 765:
break
for i in range(1, 9):
print(f'第{i}层上有{x * 2 ** (i - 1)}只琉璃灯')
if __name__ == '__main__':
choice = input() # 接收用户输入的字符串
type_judge(choice) # 调用判断输入的函数决定执行哪个函数