学校头歌作业3_1中国古代数学问题(头歌作业[Python])

本文介绍了四个编程挑战题目,涉及鸡兔同笼的数学问题、整数的组合规律、动物打洞问题以及逐层递增的宝塔灯数计算,展示了如何使用Python解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在优快云上补充前几期的内容

第1关:鸡兔同笼

"""
在同一行内输入用空格分隔的两个整数,代表头和脚的数量,计算并输出笼中各有多少只鸡和兔,
如无解则输出“Data Error!”,函数无返回值。
输入:35 94
输出:有23 只鸡,12 只兔
输入:100 5
输出:Data Error!
"""
head,feet = map(int, input().split()) #读入以空格分隔的两个整数,表示头和脚的数量
##############Begin#####################

m = (4*head - feet)/2
n = (feet - 2 * head)/2
if (round(m-int(m),4)) > 0 and  (round(m-int(n),4)) >0:
    print("Data Error!")
elif m < 0 or n < 0 :
    print("Data Error!")
else:
    m = int(m)
    n = int(n)
    print(f"有{m}只鸡,{n}只兔")
##############End#####################

第2关:物不知数

"""一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;
7个7个数也会多出2个。输入一个正整数,从小到大依次输出所有不超过输入数字
且满足条件的物品数量,有多个答案时每行输出一个。
例如输入:200
输出:
23
128
"""
n = int(input())
##############Begin#####################
z = 0
for i in range (n+1):
    if i % 3 == 2 and i % 5 == 3 and i % 7 == 2 :
        z += 1
        print(i)
if z == 0:
    print("No solution!")

##############End#####################

第3关:二鼠打洞

"""有一堵十尺厚的墙,两只老鼠从两边向中间打洞。大老鼠第一天打洞一尺,小老鼠也是打洞一尺。
大老鼠每天的打洞进度是前一天的一倍,小老鼠每天的进度是前一天的一半。计算并输出它们几天可以相逢,
相逢时各打了多少尺。
输入格式:输入1 个整数,代表墙的厚度,单位为尺
输出格式:
第一行输出1 个整数,表示相遇时所需的天数
第二行输出2 个浮点数,分别为小鼠和大鼠打洞的距离,单位为尺,保留小数点后1 位数字。
"""
wall = int(input()) #墙壁的厚度
rat, mouse, day, time = 1, 1, 0, 1 #大鼠速度、小鼠速度、天数、当天工作时长(1表示工作一整天)
distance_of_rat, distance_of_mouse = 0, 0 #大鼠路程、小鼠的路程
while wall > 0:
################Begin#######################
    
    wall = wall - rat - mouse
   
    if wall  <=0:   
        wall = wall + rat + mouse
        x = wall /(rat + mouse)
        distance_of_rat +=   rat * x
        distance_of_mouse +=  mouse * x
        wall = wall - rat - mouse
        day += 1 
        
    else:
        distance_of_rat +=   rat
        distance_of_mouse +=  mouse
        day += 1 
        rat = 2 * rat
        mouse = 1/2 * mouse
################End#######################
print(day)
print(round(distance_of_mouse, 1), round(distance_of_rat, 1)) #使用round函数来保留小数点后一位

第4关:宝塔上的琉璃灯

"""有一座八层宝塔,每一层都有一些琉璃灯,每一层的灯数都是上一层的二倍,
已知共有765 盏琉璃灯,计算并输出每层各有多少盏琉璃灯。
输出为8行,每行都是一个正整数,从上往下数字依次增大,每个数字代表本层宝塔上的琉璃灯数目。
"""

    #################Begin#############################

from itertools import count

for first in count(1,1):
    floors = [first*(2**i) for i in range(8)]
    if sum(floors) == 765:
        for index,value in enumerate(floors,start=1):
            print(value)
        break
    #################End#############################

第5关:李白买酒

"""大诗人李白,提着酒壶,从家里出来,酒壶中有酒若干。他边走边唱:无事街上走,提壶去买酒,
遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒,计算并输出壶中原有酒几斗?
"""
#解题思路:让李白按路线逆向走一遍
wine =0  #最后酒壶空了
################Begin#################
for i in range(5):
    #遇到鲜花
    wine = wine +1
    #遇到酒店
    wine = wine / 2

################End#################
print(wine) #原来有多少斗酒

### 使用 Python 编程解决古代数学问题 #### 一、二鼠打洞问题 这是一个经典的中国古代数学问题,描述如下:两鼠分别从两端向中间挖通一条长度为 $L$ 的墙。大鼠每天前进的速度增加一倍,而小鼠每天前进的速度减少一半。求它们相遇所需的天数以及各自走过的距离。 以下是基于循环实现的解决方案: ```python def two_mice_hole(length): big_mouse_speed = 1 # 大鼠初始速度 small_mouse_speed = 0.5 # 小鼠初始速度 days = 0 # 记录天数 total_distance_big = 0 # 大鼠总路程 total_distance_small = 0 # 小鼠总路程 while True: days += 1 total_distance_big += big_mouse_speed total_distance_small += small_mouse_speed if (total_distance_big + total_distance_small) >= length: break # 更新速度 big_mouse_speed *= 2 small_mouse_speed /= 2 remaining_length = length - (total_distance_big + total_distance_small) last_day_contribution_big = big_mouse_speed * (remaining_length / (big_mouse_speed + small_mouse_speed)) last_day_contribution_small = small_mouse_speed * (remaining_length / (big_mouse_speed + small_mouse_speed)) total_distance_big += last_day_contribution_big total_distance_small += last_day_contribution_small return days, round(total_distance_big, 2), round(total_distance_small, 2) result = two_mice_hole(100) print(f"Days: {result[0]}, Big Mouse Distance: {result[1]}, Small Mouse Distance: {result[2]}") ``` 上述程序通过模拟每一天两只老鼠的移动情况,最终得出它们相遇所需的时间及其各自的行走距离[^1]。 --- #### 二、李白买酒问题问题是关于李白饮酒的一个趣味题目,具体描述为:李白提着一瓶酒出门游玩,在路上遇到一家酒店,他喝了一半又加满;接着再往前走一段路,再次喝酒并加满……如此反复多次后回到家中,瓶中恰好还剩下原来的量。求最初瓶子中的酒有多少升? 下面是利用循环解决问题的方法: ```python def li_bai_drinking(final_volume=8): # 假设最后剩余体积为8单位 volume = final_volume steps = 0 while volume != 0: steps += 1 before_addition = volume * 2 # 加入前的状态恢复 volume = before_addition / 2 # 饮用后的状态还原 initial_volume = volume * 2 ** steps return initial_volume initial_amount = li_bai_drinking() print(f"The initial amount of wine was {initial_amount} liters.") ``` 这段代码逆向推导出最初的酒量,并假设每次操作都遵循相同的逻辑模式[^2]。 --- #### 三、中国剩余定理问题 这是另一个著名的古代数学难题,《孙子算经》提到的内容可以转化为现代形式表示为联立同余方程组。下面展示如何借助暴力枚举法找到满足条件的结果: ```python def chinese_remainder_theorem(): for num in range(1, 1000): # 枚举可能解的空间范围 if num % 3 == 2 and num % 5 == 3 and num % 7 == 2: return num solution = chinese_remainder_theorem() print(f"The smallest number satisfying the conditions is {solution}.") ``` 这里采用简单的遍历策略逐一验证候选数值是否符合条件,从而得到最小正整数解[^3]。 --- ### 总结 以上三个例子展示了不同类型的古典数学趣题可以通过编写简洁高效的 Python 脚本来加以解答。每种算法均体现了特定的设计思路与技巧应用价值所在。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值