2017-12-03 12 views
1

私の問題は、上記の数字の中で5桁の数字の中で最大の製品を見つけるために長い数字でサイクリングしています。私は解決策を持っていますが、現時点では、要素の位置のハードコーディングが含まれています。気分が悪くて、スケーラブルではありません。このソリューションを "Python"してそれを入れ子にしたり、何らかの方法で最適化する方法はありますか?要素の位置をハードコーディングせずにループを入れ子にする方法

n = 82166370484403199890008895243450658541227588666881 

N = str(n) 
Pro = 0 
for i in range(0, len(N) - 4): 
    TemPro= int(N[i])*int(N[i+1])*int(N[i+2])*int(N[i+3])*int(N[i+4]) 
    if TemPro> Pro : 
     Pro = TemPro 
print(Pro) 

OS:Windows 7の
言語:Pythonの3

+0

'TemPro = int(N [i])... 'の部分はループで実行できるようです。いつものように、繰り返しを見るたびに、ループや関数に到達することを検討してください。あなたが数の範囲を超えてforループを持っていて、ループの中で掛け合われていれば、私はそれが働いているのを見ることができました。 – Carcigenicate

+0

それは私の正確な考えでしたが、私はそれが1)境界外または2)二重の計数をし、それゆえに間違った答えを返さなければ、それを働かせるようには見えません。したがって、誰かがこれに精通しているかどうかを尋ねて、成功した実装の正しい方向に私を促すことができます。 –

+0

数字を計算すると、約1ミリ秒節約できました。素晴らしい呼び声、ありがとう! –

答えて

0

Nのスライス上reduceを使用するための完璧なケース:

from functools import reduce # python 3 
nb_terms = 5 
for i in range(0, len(N) - nb_terms - 1): 
    TemPro= reduce(lambda x,y:int(x)*int(y),N[i:i+nb_terms]) 
    if TemPro> Pro : 
     Pro = TemPro 
print(Pro) 

reduceは、一緒にすべての項目を掛けます目に見えるループがなくても、用語の数をハードコーディングする必要はありません。

+0

スポットあり、ありがとうございます!私はラムダ関数について知っていますが、私はオンラインコースでそれらをカバーしていないので、私はそれらを適用することを考えませんでした。 –

0

整数全体を一連の数字に変換してから、reducemulとスライスを使用してスライディングウィンドウの積を計算することで、これを非常に簡潔に行うことができます。すべての意図や目的のために、それは高速で十分ですが、それはいくつかの不必要なオブジェクトの作成を必要とする - の数字を見つけることのこの方法は、理論的には一種の遅いこと

from functools import reduce 
from operator import mul 

n = 82166370484403199890008895243450658541227588666881 

def largest_prod(n, length=5): 
    digits = [int(d) for d in str(n)] 
    return max(reduce(mul, digits[i:i + length]) for i in range(len(digits) - length + 1)) 

print(largest_prod(n)) 

注意。パフォーマンスについて本当に気にしているのであれば、私がmy answer hereで議論したのと同様の算術的アプローチを使用することができます。

関連する問題