经典算法的Python实现(2)

写在前面的话:

学习米铺高级架构师的博文中算法的内容,试着将里面的例子用Python加以实现,尚属练习,不足之处请指正。

文章参考地址:经典算法专题


第二题 五家共井

问题描述

古代数学巨著《九章算数》中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠;乙三绠不足,如丙一绠;丙四绠不足,如丁一绠;丁五绠不足,如戊一绠;戊六绠不足,如甲一绠,皆及。

意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水;乙家的绳子用三条不够,还要再用丙家的绳子一条才能打到井水;丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水;丁家的绳子用五条不够,还要再用戊家的绳子一条才能打到井水;戊家的绳子用六条不够,还要再用甲家的绳子一条才能打到井水。

最后问:井有多深?每家的绳子各有多长?

普通想法

列出方程组,找出五个未知数的关系。

#!/usr/bin/python
# -*- coding:utf-8 -*-

"""
元素间关系
      a=b+c/2  
      b=c+d/3   
      c=d+e/4   
      d=e+a/5
h 为井深
"""

flag = True
a = b = c = d = e = h = 0

while flag:
    #4的倍数
    e += 4
    a = 0

    while flag:
        #5的倍数
        a += 5
        d = e + a / 5
        c = d + e / 4

        if c % 2 != 0:
            continue
        if d % 3 != 0:
            continue
        b = c + d / 3
        if (b + c / 2) < a :
            break

        if (b + c /2) == a:
            flag = False  

h = 2 * a + b

print u"五家的井深分别为: %d, %d, %d, %d, %d -----井深: %d" % (a, b, c, d, e, h)     

结果

同样时间复杂度为O(N^2),需要优化。

优化后的代码

#!/usr/bin/python
# -*- coding:utf-8 -*-

"""
     b=h-2a   ⑥
     c=h-3b   ⑦
     d=h-4c   ⑧
     e=h-5d   ⑨
     a=h-6e   ⑩
将⑥,⑧,⑨,⑩分别代入⑦,一阵痉挛后可知:
     c=(148/721)h
上面的公式也就表明了c和h的比例关系,我们令 h=721k,则 c=148k,
将其代入⑥,⑦,⑧,⑨,⑩可得如下方程组
     a=265k
     b=191k
     c=148k
     d=129k
     e=76k
     x=721k
又因为k>0,所以题目有无数个解。这里我就取0<k<5,否则绳子已经到达极限了,需要用蛟龙号去深潜了。
"""

for k in range(1, 5):
    h = 721 * k
    a = 265 * k
    b = 191 * k
    c = 148 * k
    d = 129 * k
    e = 76 * k

    print u"五家的井深分别为: %d, %d, %d, %d, %d -----井深: %d" % (a, b, c, d, e, h)  

优化后的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值