描述
中国古代《周髀算经》、《九章算术》和《孙子算经》等数学著作中记载了很多有趣的数学问题,其中很多题目非常适用于计算机求解,下面给出几个有趣的问题。
- 鸡兔同笼
大约在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只琉璃灯”。
示例 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
输入:
割圆法求圆周率
输出:
输入错误
参考代码
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() # 用户输入为'宝塔上的琉璃灯'调用此函数
else:
print('输入错误')
def chicken_rabbit():
"""
在同一行内输入用空格分隔的两个整数,代表头和脚的数量,计算并输出笼中各有多少只鸡和兔,
如无解则输出“Data Error!”,函数无返回值。
输入:35 94
输出:有23只鸡,12只兔
输入:100 5
输出:Data Error!
"""
# =======================================================
a,b = map(int,input().split(' ')) #读入两个整数到a,b中,输入的数用空格分隔
i = 0
while ( i <= a ):
if( 2 * i + 4 *(a - i) != b):
i +=1
else:
break
if( i != 0 and i <= a ):
print('有{:.0f}只鸡,{:.0f}只兔'.format(i, a-i))
else:
print("Data Error!")
# =======================================================
def amount_of_goods():
"""一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;
7个7个数也会多出2个。输入一个正整数,从小到大依次输出所有不超过输入数字
且满足条件的物品数量,有多个答案时每行输出一个。
例如输入:200
输出:
23
128
"""
# =======================================================
n = int(input())
for i in range(1,n+1):
if ( i % 3 == 2 and i % 5 == 3 and i % 7 == 2):
print(i)
# =======================================================
def two_mice():
"""有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打洞一尺,小老鼠也是打洞一尺。
大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。计算并输出它们几天可以相逢,
相逢时各打了多少尺。
输入格式:输入1 个整数,代表墙的厚度,单位为尺
输出格式:
第一行输出1 个整数,表示相遇时所需的天数
第二行输出2 个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,保留小数点后1 位数字。
"""
# =======================================================
n = int(input())
a, b, day, time = 1, 1, 0, 1
c1, c2 = 0, 0
while n > 0:
if n - a - b < 0:
time = n / (a + b)
n = n - a - b
c1 += time * a
c2 += time * b
a = a * 2
b = b / 2
day = day + 1
print(day)
print(round(c2, 1), round(c1, 1))
# =======================================================
def libai_buy_wine():
"""大诗人李白,提着酒壶,从家里出来,酒壶中有酒若干。他边走边唱:无事街上走,提壶去买酒,
遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒,计算并输出壶中原有酒几斗?
"""
# =======================================================
num = 0
for i in range (5):
num += 1
num = num/2
print(num)
# =======================================================
def lamp_on_pagoda():
"""有一座八层宝塔,每一层都有一些琉璃灯,每一层的灯数都是上一层的二倍,
已知共有765 盏琉璃灯,计算并输出每层各有多少盏琉璃灯。
输出为8行,从上往下数字依次增大。
"""
# =======================================================
a = 1
sum = 0
for i in range(1,9):
sum += a
a = a * 2
i += 1
n1 = (int)(765 / sum)
for j in range(1,9):
n = n1 * 2**(j-1)
print('第{:.0f}层上有{:.0f}只琉璃灯'.format(j,n))
# =======================================================
if __name__ == '__main__':
choice = input() # 接收用户输入的字符串
type_judge(choice) # 调用判断输入的函数决定执行哪个函数