2つの3桁の積の最大の回文数に分解することができることを求めます

1672 ワード

注:回文数とは、正順と逆順が等しい数字で、9009の逆順か9009の逆順か
タイトルでは、この返信数が2つの3桁の積であることを知っています.それでは、コードを簡単に書くことができます.

#        
def	reverse(num):
    strnum = str(num)[::-1]
    return int(strnum)

max = None
for a in range(100, 1000):
    for b in range(100, 1000):
        rs = a * b
        if rs == reverse(rs) and rs > max:
            max = rs
print max

この方法で私たちは結果を得ることができますが、効率が悪いようです.プログラムを最適化する方法を分析します.
1.上記の手順では、aとbの積が繰り返されますか?例えば、a=132、b=528がa=528、b=132の結果と同じである場合、bがaより小さいか大きいかを設定することで、このような状況を回避することができるかどうか.
2.问题は私达が探している最大の积み重ねを要求して、あの2つの3桁の数もきっと大きくて、私达は大きいから小さいまでクエリーを使って、小さいから大きいまでクエリーよりずっと速いのではないでしょうか.
3.2つの3桁の積は6桁に違いないが、この6桁の回文数Pはxyzzyxの形式で表すことができ、次の式を得ることができる.
P = 100000x + 10000y + 1000z + 100z + 10y + x
P = 100001x + 10010y + 1100z
P = 11(9091x + 910y + 100z)
この式では,回文数は11の倍数であり,11は質量数であることが分かった.これは,aが11で除去できるのではなく,bが11で除去できることを示している.では、私たちは11を入力数として合理的に利用するのは、元の1よりも効率的ではないでしょうか.
上記の分析により、コードを書き換えます.

#        
def	reverse(num):
    strnum = str(num)[::-1]
    return int(strnum)

max = None
for a in range(999, 99, -1):
    db = -1
    start = 999
    if a % 11 != 0:
        start = 990
        db = -11
    for b in range(start, 99, db):
        rs = a * b
        if rs == reverse(rs):
            if rs > max:
                max = rs
            else:
                break
print max

テストにより、従来のプログラムは810000サイクルを必要としたが、最適化されたプログラムは71533サイクルしか必要とせず、性能は10倍以上向上した.