鸡兔同笼问题

问题描述

问题:今有雉、兔同笼,上有三十五头,下有九十四足,问雉、兔各几何?

数学解法

假设法

假设有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))
Made with Slides.com