は、いくつかの時間を取って、問題を研究しました。私は逆のアプローチ(回文数字から始まり、もしあれば分数を見つける)を試みた。 Py354をWin10に使用する。
code.py:
import time
from math import sqrt
def reverse(str, aux=''):
count = len(str)
while count > 0:
aux += str[count-1]
count -= 1
return aux
def palindrome(num):
j = str(num)
if j == reverse(j):
return 1
else:
return 0
def question_makhfi_0():
ret = 0
i = 999
found = 0
while i > 99 and not found:
j = 999
while j > 99 and not found:
if palindrome(i * j):
found = 1
ret = i * j
else:
j -= 1
if not found:
i -= 1
return ret, i, j
def answer_makhfi_0():
i = 999
_max = 0
while i > 99:
j = 999
while j > 99:
num = i * j
if palindrome(num):
if num > _max:
_max = num
factor0, factor1 = i, j
j -= 1
i -= 1
return _max, factor0, factor1
"""
def answer_makhfi__0_improved_0():
i = j = 999
prod = i * j
step = 0
while prod > 100000:
if step % 2:
i -= 1
else:
j -= 1
prod = i * j
prod_str = str(prod)
if prod_str == prod_str[::-1]:
return prod
step += 1
"""
def answer_cfati_0():
pal = 999999
while pal >= 900009:
if pal % 10 == 9:
pal_str = str(pal)
if pal_str == pal_str[::-1]:
pal_sqrt = sqrt(pal)
for factor0 in range(101, int(pal_sqrt) + 1):
if pal % factor0 == 0:
factor1 = int(pal/factor0)
if 100 <= factor1 <= 999:
return pal, factor0, factor1
pal -= 10
#return pal
def time_func(f, *args):
t0 = time.time()
res = f(*args)
t1 = time.time()
return t1 - t0, res
if __name__ == "__main__":
for func in [question_makhfi_0, answer_makhfi_0, answer_cfati_0]:
print("\nStarting: {}".format(func.__name__))
#print(func.__name__)
res = time_func(func)
print(" Time: {:.6f}\n Result: {}".format(*res))
ノート:
- は、(すべての必要な調整を行っている、とはパフォーマンスを必要とするすべてを省略)関数にコードを回し
- 実行時間を測定する追加のfuncを追加しました
answer_makhfi_0
:
- コード:
- は(いずれにせよ、非常に非効率的)の端部に
return
ステートメントを追加
- 組み込み名
answer_cfati_0
をシャドウイング回避する_max
によってmax
を置き換え[900009, 999999]
の範囲にある回文数字があると仮定します。これは2桁(3桁)の麻痺ers製品。それが(テストがこれをサポートしている)と仮定することは公正です。 防弾コードを目指し、このフォームはそれを行うことはありません場合は、私はそれを少し調整する必要があります(それが損失性能ワイズとなります)
- それは数学的/論理的な「ショートカットのすべての種類を使用しています無駄な計算を避けるために(コードはその方向性を改善することもできると思う)。
出力:
"e\Work\Dev\StackOverflow\q47999634>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py
Starting: question_makhfi_0
Time: 0.008551
Result: (580085, 995, 583)
Starting: answer_makhfi_0
Time: 1.457818
Result: (906609, 993, 913)
Starting: answer_cfati_0
Time: 0.012599
Result: (906609, 913, 993)
出力によれば、オリジナルと新しいコードとの間の差(実行するため、時間が変わるように) :
- 最大の回文数: - それを計算する
- 時間:1.457818 - EDIT0 @0.012599
:
- あなたのコメントのおかげで、私のコードには(重大な)論理エラー(およびいくつかの小さなもの)が見つかりました:( * )を返していました。それらを固定した後、パフォーマンスが一桁減少したが、それはまた、(チェックのため)要因を返すために、まだ
- 修正機能高速です
それは998×999どちらを試みる前に、あなたのアプローチは、999×100をしようとしますあなたはもっと大きいと思いますか? – Ryan
@Ryan Oups!あなたはそうです、ありがとう! –
'def palindrome(num):return str(num)== str(num)[:: - 1]' – kindall