2017-05-17 3 views
1

私はこのプログラムを作成して、この数値に隣接する13個の隣接数字を見つけ出します。一緒に追加すると、合計が最大になります。しかし、私がそれを実行すると、b値は12で始まらない。それはあまりにも高い数字で始まり、私は理由を理解できません。なぜ私のaとbの値が正しくインクリメントしていないのか?最大隣接数 - 誤って増分する値

num = "731671765313306249192251196744265747423553491949349698352031277450632623957831801698480186947885184385861560789112949495459501737958331952853208805511125069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450" 

a = 0 
b = 12 
greatest = 0 


while b != len(str(num)): 
    num = str(num) 
    newNum = num[a:b] 
    total = 0 
    for num in newNum: 
     num = int(num) 
     total += num 
    if total > greatest: 
     greatest = total 
    a+=1 
    b+=1 
    print(b) 

print(greatest) 
+0

方法:数の長さマイナス)で動作しますか? –

+0

同じスコープ内で変数名を再使用しないでください。 – user2357112

+0

また、 'b'は12で始まります。 – user2357112

答えて

1

主な問題は、あなたが最初に実行した後、間違った「オリジナル」numをレンダリングする内部ループでnumを再利用しているということです。それはすでに文字列、およびに沿ってbを変更する必要はありませんですので、

あなたは13桁がランインしたい場合また、あなたはより良いb = 13

で始まると思います。さらに、str(num)のための必要はありませんプログラム。内部ループをsummapに置き換えることもできます。ここで

は、これらの変更後にどのように見えるかです:

num = "731671765313306249192251196744265747423553491949349698352031277450632623957831801698480186947885184385861560789112949495459501737958331952853208805511125069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450" 

index = 0 
run_in = 13 
greatest = 0 

while index + run_in < len(num): 
    num_slice = num[index: index + run_in] 
    slice_sum = sum(map(int, num_slice)) 

    if slice_sum > greatest: 
     greatest = slice_sum 

    index += 1 

print(greatest) 

あなたはスーパーの関数にしている場合は、すべての可能なインデックスを反復、リスト内包とmax閉鎖と同じ効果を作成することができます(まで代わりに* `num`を再定義し、*他の変数のために* *他の単語を使用しない程度

greatest = max(sum(map(int, num[index: index + run_in])) for index in range(len(num) - run_in)) 
0
def largest(num, k): 
    num = str(num) 
    if len(num) < k: raise ValueError("Need a number with at least {} digits".format(k)) 
    currsum = sum(int(i) for i in num[:k]) 
    answer = currsum, 0 
    i = k+1 
    while i < len(num): 
     currsum -= int(num[i-k]) 
     currsum += int(num[i]) 
     if currsum > answer[0]: answer = currsum, i 
     i += 1 
    return answer 

total, ind = largest(myNum, 13) 
print("The maximum sum of digits is {}, starting at index {}".format(total, ind))