鸡兔同笼问题
问题描述
问题:今有雉、兔同笼,上有三十五头,下有九十四足,问雉、兔各几何?
数学解法
假设法
假设有35只鸡 \\
脚的数量:35*2=70(只)\\
剩余脚的数量:94-70=24(只)\\
由于兔子比鸡多了两只脚,因此剩下的脚全部都是兔子的\\
兔子的数量:24 \div2=12(只)\\
鸡的数量:35-12=23(只)
方程解法
\begin{cases}
x+y=35\\
2x+4y=94
\end{cases}
设鸡有x只,兔有y只
穷举算法的实现
分析
假设兔子的数量为:1 \\
那么鸡的数量为:35-1 \\
检查\quad 兔子的数量*4+鸡的数量*2 \quad是否等于94
假设兔子的数量为:2 \\
那么鸡的数量为:35-2 \\
检查\quad 兔子的数量*4+鸡的数量*2 \quad是否等于94
假设兔子的数量为:3 \\
那么鸡的数量为:35-3 \\
检查\quad 兔子的数量*4+鸡的数量*2 \quad是否等于94
实现
for i in range(1,36):
chicken=i
rabbit=35-i
if chicken*2+rabbit*4==94:
print("鸡的数量为:",i)
print("兔子的数量为:",35-i)
#运行结果
#鸡的数量为: 23
#兔子的数量为: 12
format()函数的妙用
使用str.format()的形式即可,str可以替换成任意字符串
print("{},{}".format("hello","world"))
# 运行结果:
# hello,world
还可以通过设置参数的方式来进行替换
print("name:{name},age:{age}".format(name="siqu",age=32))
# 运行结果:
# name:siqu,age:32
还可以通过设置参数的方式来进行替换
print("name:{name},age:{age}".format(name="siqu",age=32))
# 运行结果:
# name:siqu,age:32
有了format之后,我们就可以采用新的方式来输出我们运算出来的结果了
for i in range(1,36):
chicken=i
rabbit=35-i
if chicken*2+rabbit*4==94:
print("鸡的数量:{},兔子的数量为:{}".format(i,35-i))
#运行结果
#鸡的数量:23,兔子的数量为:12
算法优化
import time
start=time.time()
head=3500000 #表示有多个头
foot=9400000 #表示有多少个脚
for i in range(1,head+1):
chicken=i
rabbit=head-i
if chicken*2+rabbit*4==foot:
print("鸡的数量:{},兔子的数量为:{}".format(i,head-i))
end=time.time()
print("运行的时间为:{}".format(end-start))
#运行结果
# 鸡的数量:2300000,兔子的数量为:1200000
# 运行的时间为:2.151245355606079
我们在算出结果后就不需要继续循环了
比如当head等于35,foot等于94时,我们总共需要循环35次,但是当i=23的时候,我们就没有必要在继续循环了,因为我们已经找到了正确答案
import time
start=time.time()
head=3500000 #表示有多个头
foot=9400000 #表示有多少个脚
for i in range(1,head+1):
chicken=i
rabbit=head-i
if chicken*2+rabbit*4==foot:
print("鸡的数量:{},兔子的数量为:{}".format(i,head-i))
break
end=time.time()
print("运行的时间为:{}".format(end-start))
#运行结果
# 鸡的数量:2300000,兔子的数量为:1200000
# 运行的时间为:1.456103801727295
综合练习
我国古代数学家张丘建在《算经》一书中提出了一个数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
翻译成现代文:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡,其中公鸡、母鸡、小鸡都必须要有。问公鸡、母鸡、小鸡要买多少只刚好凑足100文钱?(注:可能有多种符合条件的方案,请全部列出)
for x in range(1,99): #设公鸡有x只,由于三种鸡都要有,因此最大只能到98
#设母鸡有y只,母鸡和小鸡总共有100-i只,但是小鸡也有,所以母鸡最多99-i
for y in range(1,100-x):
z=100-y-x
if x*5+y*3+z/3==100:
print("公鸡有:{},母鸡有:{},小鸡有:{}".format(x,y,z))
# 运算结果:
# 公鸡有:4,母鸡有:18,小鸡有:78
# 公鸡有:8,母鸡有:11,小鸡有:81
# 公鸡有:12,母鸡有:4,小鸡有:84
找零钱:现有人民币面额为1元、2元和5元的币种若干张。给你n (1≤n ≤ 250)元,让你计算换成上面这些面额表示,且总数不超过100 张,共有几种方案。比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。
提示:可以使用整除运算
money=int(input("请输入币值:"))
#记录方案数
count=0
for x in range(money//5+1):
#要用剩下来的钱进行计算
for y in range((money-5*x)//2+1):
z=money-5*x-2*y
print("需要{}张五元,需要{}张两元,需要{}张一元".format(x,y,z))
count+=1
print("共有{}种方案".format(count))
鸡兔同笼问题
By yang he
鸡兔同笼问题
- 277