一、百钱百鸡
公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。
# encoding: utf-8
x = 1
y = 1
while x <= 20:
while y <= 33:
z = 100 - (x + y)
if (z % 3 == 0) and (x * 5 + y * 3 + z / 3 == 100):
print("公鸡为%d只,母鸡为%d只,小鸡为%d只" % (x, y, z))
y += 1
y = 1
x += 1
这样的效率未免不高,测算一下这样的方案需要多少时间,
# encoding: utf-8
import time
x = 1
y = 1
start = time.clock()
while x <= 20:
while y <= 33:
z = 100 - (x + y)
if (z % 3 == 0) and (x * 5 + y * 3 + z / 3 == 100):
print("公鸡为%d只,母鸡为%d只,小鸡为%d只" % (x, y, z))
y += 1
y = 1
x += 1
end = time.clock()
print(end - start)
这样就能粗略的估计出需要多少时间得出结果,我的机器大概是0.0004s左右得出计算结果,这样的解决方案一看就不够专业,换一种通用的衡量程序性能的方法cProfile
# encoding: utf-8
import cProfile
def clca():
x = 1
y = 1
while x <= 20:
while y <= 33:
z = 100 - (x + y)
if (z % 3 == 0) and (x * 5 + y * 3 + z / 3 == 100):
print("公鸡为%d只,母鸡为%d只,小鸡为%d只" % (x, y, z))
y += 1
y = 1
x += 1
if __name__ == '__main__':
clca()
print(cProfile.run('clca()'))
或者不在主函数中运行clca,直接测算也是可以的,我保留了完整的主体结构,测量结果如下图所示:
因为之前测量的是0.0004s,所以这个测量程序的精度只到0.001s故而无法精准测量了,小程序我也不进行进一步探索怎么修改精度了,只是提供一个方法
# encoding: utf-8
import time
x = 1
y = 1
start = time.clock()
for x in range(1, 21):
for y in range(1, 34):
z = 100 - (x + y)
if (z % 3 == 0) and (x * 5 + y * 3 + z / 3 == 100):
print("公鸡为%d只,母鸡为%d只,小鸡为%d只" % (x, y, z))
y += 1
y = 1
x += 1
end = time.clock()
print(end - start)
把while循环方法改为for循环,消耗时间增长到0.0005s左右,可是我们还可以进一步改进,我们可以对方程通过进一步的推导来简化计算,从方程中可以得出,x=4k 和 y=25-7k 和 z=75+3k 则公鸡的数量一定是4的倍数,母鸡的数量以7递减,小鸡的数量以3递增
这就可以大大简化计算为
# encoding: utf-8
import time
x = 1
y = 1
start = time.clock()
for x in range(0, 21, 4):
for y in range(25, 0, -7):
z = 100 - (x + y)
if (z % 3 == 0) and (x * 5 + y * 3 + z / 3 == 100):
print("公鸡为%d只,母鸡为%d只,小鸡为%d只" % (x, y, z))
y += 1
y = 1
x += 1
end = time.clock()
print(end - start)
运行可知,时间下降到不到0.0001秒,提高了运行效率
二、五家共井
五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠;乙三绠不足,如丙一绠;丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及
# encoding: utf-8
for k in range(1, 5):
for e in range(1, 500):
a = 721 * k - 6 * e
b = 721 * k - 2 * a
c = 721 * k - 3 * b
d = 721 * k - 4 * c
e = 721 * k - 5 * d
result1 = a + 6 * e
result2 = b + 2 * a
result3 = c + 3 * b
result4 = d + 4 * c
result5 = e + 5 * d
if result1 == result2 == result3 == result4 == result5:
print('井深%d:甲家绳长%d乙家绳长%d丙家绳长%d丁家绳长%d戊家绳长%d' % (result1, a, b, c, d, e))
戊家的绳子是最短的,所以以e为循环单位,第二组解算出来就非常吓人了·····
井深721:甲家绳长265乙家绳长191丙家绳长148丁家绳长129戊家绳长76
井深1442:甲家绳长530乙家绳长382丙家绳长296丁家绳长258戊家绳长152
井深1442米的话估计一天啥也不用干光打水玩了,往下愿意算就算去吧,一口井直通地球另一端指日可待