2つの3桁の積の最大の回文数に分解することができることを求めます
1672 ワード
注:回文数とは、正順と逆順が等しい数字で、9009の逆順か9009の逆順か
タイトルでは、この返信数が2つの3桁の積であることを知っています.それでは、コードを簡単に書くことができます.
この方法で私たちは結果を得ることができますが、効率が悪いようです.プログラムを最適化する方法を分析します.
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よりも効率的ではないでしょうか.
上記の分析により、コードを書き換えます.
テストにより、従来のプログラムは810000サイクルを必要としたが、最適化されたプログラムは71533サイクルしか必要とせず、性能は10倍以上向上した.
タイトルでは、この返信数が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倍以上向上した.