一、百钱百鸡
公鸡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,直接测算也是可以的,我保留了完整的主体结构,测量结果如下图所示:

java百元百鸡问题 百元百鸡程序编写python_python


因为之前测量的是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米的话估计一天啥也不用干光打水玩了,往下愿意算就算去吧,一口井直通地球另一端指日可待