1. 百鸡百钱
百鸡百钱,即公鸡每只5元,母鸡每只3元,小鸡3只1元,一百元买一百只鸡,
问: 分别有多少只公鸡、母鸡和小鸡?
2. 问题分析
假设公鸡为x只,母鸡为y只,小鸡z只,那么以下公式成立:
x + y + z = 100
5x + 3y + z/3 = 100
按极限思维分析:
如果只买公鸡,最多能买100/5 = 20只,同理,母鸡最多能买33只。
而 z = 100 - 20 - 33 = 47,向3的倍数取整为48只,即小鸡最少为48只。
此时,进一步推理:
既然小鸡最少48只,那么公鸡和母鸡的总价为100-48/3=84元
再按照价格的极限分析,发现:
x <= ( 100 - (48/3) )/5 = 16
y <= ( 100 - (48/3) )/3 = 28
3. 编码
# -*- coding: utf-8 -*-
def hundred_calc():
#极限值实际无法达到
x = 16 - 1 # 公鸡
y = 28 - 1 # 母鸡
z = 48 + 3 # 小鸡
for xindex in range(0, x):
for yindex in range(0, y):
for zindex in range(z, 100, 3):
if xindex + yindex + zindex == 100 and 5*xindex + 3*yindex + zindex/3 == 100:
print("公鸡 ", xindex, " 母鸡 ", yindex, " 小鸡 ", zindex)
hundred_calc()
4. 总结
经过简单地分析问题,能有效地节省计算机资源。
- 按硬核编码,理论计算100 * 100 * 100 = 1000000次
- 增加步长(倍数),理论计算 33 * 100 * 100 = 330000次
- 一次极限判断,理论计算20 * 33 * 17 = 11220次
- 二次判断,理论计算 15 * 27 * 16 = 6840次