2017-12-27 13 views
1

なぜそれが間違っていますか?数字が回文かどうかを確認する別の方法はありますか?プロジェクトオイラー:2桁の3桁の数字の最大の回文プロダクト

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 

i = 999 
found = 0 
while i > 99 and not found: 
    j = 999 
    while j > 99 and not found: 
     if palindrome(i * j): 
      found = 1 
      print(i * j) 
     else: 
      j -= 1 
    if not found: 
     i -= 1 

私のポストは、ほとんどのコードですが、私は言うことを何も持っていません。

+0

それは998×999どちらを試みる前に、あなたのアプローチは、999×100をしようとしますあなたはもっと大きいと思いますか? – Ryan

+0

@Ryan Oups!あなたはそうです、ありがとう! –

+4

'def palindrome(num):return str(num)== str(num)[:: - 1]' – kindall

答えて

1

は、いくつかの時間を取って、問題を研究しました。私は逆のアプローチ(回文数字から始まり、もしあれば分数を見つける)を試みた。 Py354Win10に使用する。

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

  • あなたのコメントのおかげで、私のコードには(重大な)論理エラー(およびいくつかの小さなもの)が見つかりました:( * )を返していました。それらを固定した後、パフォーマンスが一桁減少したが、それはまた、(チェックのため)要因を返すために、まだ
  • 修正機能高速です
+0

ありがとうございます@CristiFati、私それを読むために私の時間がかかり、本当に私に利益をもたらしました。 1つの質問、あなたが得た結果(998899)は、その数字の製品で作られていますか?それは間違いなく906609よりも高いですが、Project Eulerの質問は正解として906609を許可しています。 –

0

新コード:

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 

i = 999 
max = 0 
while i > 99: 
    j = 999 
    while j > 99: 
     num = i * j 
     if palindrome(num): 
      if num > max: 
       max = num 
       print(max) 
     j -= 1 
    i -= 1 
+0

https://gist.github.com/ryan-copperleaf/a3d5861caca54de4ee39726d7fb3a879 – Ryan

関連する問題