年齢の問題


問題の説明:
王二、張三、李四、劉五の年齢は等差数列になっており、彼ら4人の年齢加算は28で、乗算は585である.彼らの年齢を前の4項の等差数列の前の15項を求めます.
マイコード:
def fun(sum,cj):
    for a in range(1,7):
        for d in range(1,5):
            sum=2*a+3*d
            cj=a*(a+d)*(a+2*d)*(a+3*d)
            if sum==14 and cj==585:
                print "wang er is %d old,the difference is %d" % (a,d)
                return a,d
aa,dd=fun(28,585)
for i in range(0,15):
    print aa+dd*i,

私の考え:
等差数列通項式に従い,王二年齢をa,公差をdと仮定すると,条件2 a+3 d=14を満たす.
a(a+d)(a+2 d)(a+3 d)=585であり、またaの範囲が1から7であり、dの範囲が1から5であるため、貧挙法を用いてaとdの値を求めることができ、さらにこの等差数列の上位15項を求めることができる.
サンプルコード:
def sum(a, k, n):
    s = a
    for i in xrange(1, n):
        s += a + i * k
    return s
def mul(a, k, n):
    s = a
    for i in xrange(1, n):
        s *= a + i * k
    return s
for a in range(1, 28 / 4):
    find = False
    k = 1
    while True:
        t = sum(a, k, 4)
        if t >= 28:
            if t == 28 and mul(a, k, 4) == 585:
                find = True
            break
        k += 1
    if find:
        for i in xrange(4):
            print a + i * k,

出典:http://www.cheemoedu.com/exercise/46