2017-05-17 1 views
1

J'écris ce programme pour trouver les 13 chiffres adjacents de ce nombre qui, lorsqu'ils sont additionnés, ont la plus grande somme. Quand je l'exécute, cependant, la valeur de b ne commence pas à 12; ça commence à un nombre obscène et je n'arrive pas à comprendre pourquoi. Une idée de pourquoi mes valeurs a et b ne s'incrémentent pas correctement?Les plus grands nombres adjacents - incrémentation incorrecte des valeurs

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

comment de ne pas redéfinir 'num' et en utilisant * autres mots * pour * autres variables * au lieu? –

+0

Ne réutilisez pas les noms de variables dans la même étendue. – user2357112

+0

De plus, 'b' commence à 12 très bien. – user2357112

Répondre

1

Le principal problème est que vous réutilisez num dans la boucle intérieure, ce qui rend le « original » num mal après la première manche.

De plus, si vous voulez un rodage 13 chiffres, vous feriez mieux de commencer par b = 13

Et en outre, il n'y a pas besoin de str(num) car il est déjà une chaîne, et pas besoin de changer b le long le programme. Vous pouvez également remplacer la boucle interne par sum sur map.

Voici ce qu'il devrait ressembler après ces changements:

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) 

Si vous êtes en fonctions super, vous pouvez créer le même effet avec une compréhension de liste et une fermeture max, itérer tous les indices possibles (jusqu'à la longueur du nombre moins la course en):

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))