2017-05-11 3 views
1

Ich arbeite durch diese Kata und obwohl ich die Lösungen durchgesehen habe, sind keine so ähnlich wie meine, um meine Frage zu beantworten.Nehme eine Zahl und summiere ihre Ziffern

Problemtext: Die Zahl 89 ist die erste Ganzzahl mit mehr als einer Ziffer, die die teilweise im Titel dieser Kata eingeführte Eigenschaft erfüllt. Was nützt es, "Eureka" zu sagen? Weil diese Summe die gleiche Nummer gibt.

In Wirkung: 89 = 8^1 + 9^2

Die nächste Zahl in dieser Eigenschaft aufweist, ist 135.

diese Eigenschaft wieder Siehe: 135 = 1^1 + 3 + 5^2^3

Wir brauchen eine Funktion, um diese Zahlen zu sammeln, die zwei ganze Zahlen a, b erhalten können, die den Bereich [a, b] (inklusive) definieren und eine Liste der sortierten Zahlen in dem Bereich ausgeben, der die Eigenschaft erfüllt oben beschrieben.

def sum_dig_pow(a, b): # range(a, b + 1) will be studied by the function 
    # your code here 
    lst = [] 
    n = 1 
    tot = 0 
    for i in range(a,b): 
     if i > 9: 
      spl = str(i).split() 
      for item in spl: 
       tot += int(item) ** n 
       n += 1 
       if tot == i: 
        lst.append(i) 
     else: 
      lst.append(i) 
    return lst 

Tests zurückkehren „[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] sollte gleich [1, 2, 3, 4, 5, 6, 7, 8 , 9, 89] ". Ich kann nicht herausfinden, warum es 10 überschreitet und nicht 89 anfügt. Ich bin mir sicher, dass es einen effizienteren Weg gibt, dies zu tun, aber ich lerne immer noch so will in Grundlagen von Schleifen, Konditionalen, etc arbeiten.

Vielen Dank für Ihr Feedback! Ich weiß, enumerate ist wirklich nützlich bc ive verwendet es in der Vergangenheit, aber ich konnte nicht ganz vorstellen, wie es hier hilfreich war>. <. Hier ist die Lösung, die für mich funktionierte, PLZ Kommentar mit Aufräumarbeiten, etc !!

def sum_dig_pow(a, b): # range(a, b + 1) will be studied by the function 
lst = [] 
for i in range(a,b+1): 
    if i > 9: 
     s = sum_dig(i) 
     if s == i: 
      lst.append(i) 
    else: 
     lst.append(i) 
return lst 

def sum_dig(num): 
n = 1 
tot = 0 
for dig in str(num): 
    tot += int(dig)**n 
    n+=1 
return tot 
+0

Ihr Leben wird einfacher, wenn Sie eine Funktion 'sum_of_digits' schreiben, um die Ziffern einer Zahl zu summieren. Auf diese Weise können Sie sich darauf konzentrieren, dass das Programm eigenständig funktioniert, und Sie können dann einen einzelnen Funktionsaufruf verwenden, dem Sie vertrauen. –

+0

summieren Sie die * Potenzen * der Ziffern. –

+0

@ juanpa.arrivillaga Danke für die Korrektur. –

Antwort

1

Diese Zeile ist falsch:

spl = str(i).split() 

Die split Methode eine Zeichenfolge auf Leerzeichen standardmäßig geteilt wird und eine Liste zurück. So gibt i=10 gibt spl = ['10'] zurück, eine Liste mit einem Element. Stattdessen iterieren Sie einfach über jede der Ziffern in der Zeichenfolge.

for item in str(i): 
    ... 

Follow-up: Sie Ihren Code verkürzen enumerate unter Verwendung des Index jeder Ziffer zu zählen.

+1

Sie können einfach über 'str (i) 'iterieren, Sie müssen' .split() 'nicht aufrufen. – Blender

+0

Sie können [** 'enumerate' **] (https://docs.python.org/2/library/functions.html#enumerate) beginnen, beginnend bei' 1', so dass Sie 'i + 1 nicht tun müssen 'jedes Mal. –

0

Statt viel Zeit mit der Konvertierung von Zahlen in Strings und zurück zu verbringen, versuchen Sie es mit Arithmetik. Um über die Ziffern einer Zahl n zu iterieren, nehmen Sie n modulo ten (um die niedrigstwertige Stelle zu erhalten) und teilen Sie dann durch zehn (um die niedrigstwertige Stelle abzuziehen). Zum Beispiel sind die Ziffern von 123 (in umgekehrter Reihenfolge) [(123% 10), (12% 10), (1% 10)]

Denken Sie daran in Bezug auf Funktionen, erhalten Sie zuerst die Ziffern:

def digits_of_n(n): 
    result = [] 
    while n > 0: 
    result.append(n % 10) 
    n = n/10 # in python 3, use 3 // 10 for integer division 
    return reversed(result) # reverse list to preserve original order 

erhalten dann die Summe der Leistungen:

def sum_of_ith_powers(numbers): 
    result = 0 
    for i, n in enumerate(numbers): # the digits are ordered most-significant to least, as we would expect 
    result += n ** 1 
    return result 

jetzt können Sie nur sum_of_ith_powers(digits_of_n(n)) nennen, und Sie haben eine Antwort.Wenn Sie möchten, können Sie diese Operation einen Namen geben:

def sum_of_digit_powers(n): 
    return sum_of_ith_powers(digits_of_n(n)) 

und Sie können dann die Funktion benennen, die die kata löst:

def solve_kata(a, b): 
    return [sum_of_digit_powers(n) for n in range (a, b)] 
+2

Ohhhh ich sehe total warum enumerate() jetzt hilfreich ist weil es dir ** n ohne Zähler gibt, ja? –

0

können Sie verwenden ein generator, sum und enumerate, um vereinfachen Sie den Code wie in diesem Beispiel:

def sum_dig_pow(a,b): 
    for k in range(a,b+1): 
     if k > 9: 
      number_sum = sum(int(j)**i for i,j in enumerate(str(k), 1)) 
      if k is number_sum: 
       yield k 
     else: 
      yield k 

print(list(sum_dig_pow(1,10))) 
print(list(sum_dig_pow(1,90))) 
print(list(sum_dig_pow(1,10000))) 
print(list(sum_dig_pow(10,1000))) 
print(list(sum_dig_pow(1,900000))) 

Ausgang:

[1, 2, 3, 4, 5, 6, 7, 8, 9] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 89] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175] 
[89, 135, 175] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175] 
Verwandte Themen