Habe ein kleines Problem. Ich schreibe ein einfaches Programm, das Zahlen eingibt (z. B. 1567) und die ungeraden Zahlen addiert sowie in der Ausgabe auflistet. Hier ist mein Code:

import math

def oddsum(n):
    y=n%10
    if(y==0):
        return
    if(y%2!=0):
        oddsum(int(n/10))
        print (str(y),end="")
        print (" ",end="")
    else:
        oddsum(int(n/10))

def main():
    n=int(input("Enter a value : "))
    print("The odd numbers are ",end="")
    oddsum(n)
    s = 0

    while n!=0:
        y=n%10
        if(y%2!=0):
            s += y
            n //= 10

        print("The sum would be ",end=' ')
        print("=",s)
        return

main()

Es wird einwandfrei ausgegeben, im Beispiel werden 1 5 und 7 als ungerade Zahlen gedruckt. Wenn es jedoch die Summe berechnet, sagt es nur "7" anstelle von 13, wie es sein sollte. Ich kann die Logik hinter dem, was ich falsch mache, nicht wirklich verstehen. Wenn mir jemand ein bisschen helfen könnte, würde ich es schätzen :)

Ich verstehe, dass es ein Problem mit dem "s + = y" ist, da es im Grunde nur die 7 hinzufügt, aber ich bin nicht sicher, wie ich die 3 Zahlen der Ausgabe erfassen und addieren soll.

1
user9421447 18 Apr. 2018 im 01:24

3 Antworten

Beste Antwort

Wie @Anthony erwähnt, bleibt Ihr Code für immer bei 156, da es sich um eine gerade Zahl handelt.

Ich würde vorschlagen, dass Sie die Zeichenfolgeneingabe direkt verwenden und jedes Element durchlaufen.

n = input("Enter a value : ") #'1567'
sum_of_input = sum(int(i) for i in n if int(i)%2) #1+5+7=13
[print(i, end="") for i in n if int(i)%2] #prints '157'

Beachten Sie, dass int(i)%2 1 zurückgibt, wenn es ungerade ist.

1
K.Marker 18 Apr. 2018 im 01:58

1567 % 10 gibt 7 zurück. Möglicherweise möchten Sie die in oddsum gedruckten Zahlen zu einer Liste hinzufügen und die Funktion sum in dieser Liste verwenden, um die richtige Antwort zurückzugeben.

1
Joost 17 Apr. 2018 im 22:34

Das unmittelbare Problem ist, dass sich n nur ändert, wenn der Rest ungerade ist. zB 1.567 greifen 7 richtig und dann ist n = 156. 156 ist gerade, so dass s nicht inkrementiert und n nicht durch 10 dividiert werden kann, sondern für immer bei 156 sitzt.

Warum nutzen Sie Ihre Funktion nicht allgemein? Sie durchlaufen bereits eine Schleife, um herauszufinden, ob eine Zahl ungerade ist. Sie können einen globalen Parameter hinzufügen (oder ihn einfach weitergeben), um ihn zu erhöhen.

Und in einem noch effizienteren Maßstab benötigen Sie dafür keine Rekursion. Sie können die Fähigkeiten von Python nutzen, um Listen zu erstellen. Konvertieren Sie Ihre Nummer (1567) in eine Zeichenfolge ('1567') und durchlaufen Sie dann die Zeichenfolge:

total = 0
for c in '1567':
   c_int = int(c)
   if c_int%2!= 0:
      total += c_int
      print(c)

print(total)
1
ScottieB 17 Apr. 2018 im 22:40