0

Pythonで質問があり、それに対する回答を作成しましたが、回答の効率を高めようとしています。

関数、再帰、基本的なものだけを使用できません..

質問は:

2209 の 3 乗は 1000 桁です。合計が最大になる 12 個の連続した数字を見つけます。

例: 5 の 36 乗は 14551915228366851806640625 と等しくなります。最大合計を生成する 12 の連番は 836685180664 です。

sumOfBig=0
Big=""
x=5**36
strp=str(x)
s=len(strp)
print(x)
print()
for i in range(s-11):
    new=strp[i:i+12]
    l=0
    for j in new:
        l=l+int(j)
    print(i)
    print(new)
    print(l)
    print()
    if l>sumOfBig:
        sumOfBig=l
        Big=new
print(Big)
print(sumOfBig)

より良いコードのアイデアはありますか?

4

3 に答える 3

4

12 個の連続した数を合計するより効率的な方法を使用できます。12 個の連続番号を追跡し、サブセットの合計から最も古い (左端) 番号をポップ/減算し、最新 (右端) 番号をプッシュ/追加できます。

また、sum(iterable)組み込み関数です。

基本listとのみを含む私の新しいコードfor-loop:

x = 5 ** 36
num_list = [int(i) for i in str(x)]
sumOfBig = last_sum = sum(num_list[:12])
maximal_index = 0

for i, n in enumerate(num_list[12:]):
   last_sum = last_sum + n - num_list[i]
   if last_sum > sumOfBig:
      maximal_index = i+1
      sumOfBig = last_sum


print num_list[maximal_index:maximal_index+12] #[8, 3, 6, 6, 8, 5, 1, 8, 0, 6, 6, 4]
于 2013-03-08T18:48:13.440 に答える
1
x = 5**36
str_x = [int(i) for i in str(x)]


curBestIndex = 0
curBestSum = sum(str_x[:12])
curSum = curBestSum

for i in range(len(str_x) - 11):
    delta = str_x[i + 11] - str_x[i]
    curSum += delta
    if curSum > curBestSum:
        curBestSum = curSum
        curBestIndex = i

big = str(x)[curBestIndex : curBestIndex + 12]
print(big)
print(curBestSum)
于 2013-03-08T18:55:17.697 に答える
0

これは、11/12 などのすべての発生を因数分解するのに役立つ方法です。

MAX_LENGTH = 12
x = 5 ** 36

sequence = []
d = []

for i in str(x):
    d.append(int(i))
    if len(d) > MAX_LENGTH:
        d.pop(0)
    if sum(d) >= sum(sequence):
        sequence = list(d)

print sequence, sum(sequence)

戻り値:

>>> 
[8, 3, 6, 6, 8, 5, 1, 8, 0, 6, 6, 4] 61

Zen of Python の "Readability Counts" に従って、ここで提示されている 1 行のアクションは、スライス操作よりもはるかに簡単だと思います。特に、シーケンスの長さをハードコーディングする複数のインスタンスから生じる 1 つずつずれているミスを考慮する場合はそうです。

于 2013-03-08T19:10:40.043 に答える