2017-10-22 7 views
2

Ich habe an einem Übungsproblem in einer Website gearbeitet und bin irgendwann steckengeblieben.Positionsziffern Summe (Summe der Ziffern in zwei Zahlen basierend auf ihrer Position)

Die Frage ist:

Position Digits Summe

Das Programm muss zwei positive ganze Zahlen als Eingabe akzeptieren und dann Druck der Summe ihrer Einheit Ziffern, zehnten Ziffern und so weiter.

Eingabeformat: Die erste Zeile enthält A und B getrennt durch Leerzeichen.

Ausgabeformat: Die erste Zeile enthält die Summe der Einheitsziffern, zehnte Ziffern usw. mit den durch ein Leerzeichen getrennten Werten.

Randbedingungen: 1 < = A, B < = 9999999

Beispiel Input/Output 1: Input: 23 49

Output: 12 6

Beispiel Input/Output 2: Input: 12456 687

Output: 13 13 10 2 1

Well Ich löste das Problem, aber von 6 Testfällen (die versteckt sind) bestanden 5 Fälle und 1 nicht.

Dies ist mein Code:

a,b = input().split() 
assert 1<=len(a)<=7 and 1<=len(b)<=7 
assert a.isdigit() == True and b.isdigit() == True 
if len(a)>1 and len(b)>1: 
    assert a[0] != '0' and b[0] != '0' 
h = [] 
m = [] 
def pp(a,b): 
    c = [] 
    for i in range(1,len(a)+1): 
     x = int(a[-i])+int(b[-i]) 
     c.append(x) 
    return c 
if len(a)==len(b): 
    g = pp(a,b) 
    y = [str(i) for i in g] 
    for i in range(0,len(y)-1): 
     y[0] = y[0]+' '+y[1] 
     y.remove(y[1]) 
    print(y[0]) 
if len(a)>len(b): 
    d = abs(len(a)-len(b)) 
    for i in range(0,d): 
     h.append(a[i]) 
     r = a.replace(a[0:d],'') 
    p = pp(r,b) 
    p = p+h[::-1] 
    t = [str(i) for i in p] 
    for i in range(0,len(t)-1): 
     t[0] = t[0]+' '+t[1] 
     t.remove(t[1]) 
    print(t[0]) 
if len(a)<len(b): 
    d = abs(len(a)-len(b)) 
    for i in range(0,d): 
     m.append(b[i]) 
     u = b.replace(b[0:d],'') 
    q = pp(a,u) 
    q = q + m[::-1] 
    e = [str(i) for i in q] 
    for i in range(0,len(e)-1): 
     e[0] = e[0]+' '+e[1] 
     e.remove(e[1]) 
    print(e[0]) 

ich ein Anfänger bin, so habe ich nur einfache Python-Code, der es zu lange gemacht. Ich überprüfte aber nicht, was darin falsch ist. Irgendeine Hilfe?

Antwort

2

es in sehr vereinfachter Weise durchgeführt werden könnte itertools.zip_longest() in Python 3.x (äquivalent itertools.izip_longest() in Python 2.7) wie unter Verwendung von:

>>> from itertools import zip_longest 
>>> a = 123 
>>> b = 67891 

>>> [sum(map(int, x))for x in zip_longest(str(a)[::-1], str(b)[::-1], fillvalue=0)] 
[4, 11, 9, 7, 6] 

Erläuterung: mit Zwischenergebnissen Schritt zu Schritt in die oben Liste Verständnis Ausdruck:

  1. T ype-casted int Werte zu str, um sie iterierbar zu machen. Die beiden Iterablen wurden umgekehrt, so dass sie parallel mit der korrekten Potenz von 10 iteriert werden konnten (im nächsten Schritt erforderlich).

    >>> str(a)[::-1] 
    '321' 
    
  2. verwendet dann mit zip_longest, um sowohl die Iterables parallel zu iterieren.Zum Beispiel:

    >>> list(zip_longest(str(a)[::-1], str(b)[::-1], fillvalue=0)) 
    [('3', '1'), ('2', '9'), ('1', '8'), (0, '7'), (0, '6')] 
    
  3. Verwendung map, wobei jeder String-Wert in dem obigen Unterlistentyp-gegossenem zurück zu int als:

    >>> list(map(int, ('3', '1'))) 
    [3, 1] 
    
  4. Dann wird unter Verwendung sum, addierten Werte in der obigen Liste :

    >>> sum([3, 1]) 
    4 
    
+1

Ich habe zuerst den gleichen Fehler gemacht (als ich 'zip_longest' verwenden wollte, dann auf' zfill' umschalten). Aber 'zip_longest' ist immer noch gut, wenn Sie die Ziffern so umkehren, wie Sie es zuletzt getan haben. –

+0

Danke für die Hilfe. Ich denke, ich sollte viel mehr lernen –

+0

@ Jean-FrançoisFabre Meine "+1" ist schon da. Und danke, dass du mich an erster Stelle korrigiert hast. –

2

ich nicht analysieren in der Tiefe des Code, aber es enthält ungültige Konstrukte wie hier:

for i in range(0,len(y)-1): 
    y[0] = y[0]+' '+y[1] 
    y.remove(y[1]) 

hier sind Sie y ändern, während über sie iterieren, zum Beispiel.

Me, I gespalten würde, dann berechnen die längste Ganzzahl zunächst auf Null-fill-Wert, dann Ziffern verschachteln zusammen (aber Ende ausgehend, daher auch der umgekehrte Vorgang) sum und konvertieren zurück zu Zeichenfolge join

passieren
import itertools 

s = "12456 687" 

numbers = s.split() 
max_digit = max(len(x) for x in numbers) 
numbers = [x.zfill(max_digit) for x in numbers] 

# at this point: numbers = ['12456', '00687'] 

v = " ".join(reversed([str(int(a)+int(b)) for a,b in zip(*numbers)])) 
print(v) 

Ergebnis:.

13 13 10 2 1 
0

import java.util *;

public class Hallo { public static void main (String [] args)

{

// Hier Code eingeben

Scanner scan = new Scanner(System.in); 
int a = scan.nextInt(); 
int b = scan.nextInt(); 
int d1,d2,digit; 
while(a>0 || b>0) 
{ 
    d1 = a%10; 
    d2 = b%10; 
    digit = d1+d2; 
    a = a/10; 
    b = b/10; 
    System.out.print(digit + " "); 
} 

}

}

Dies ist der korrekte Code für Positionszahlen Summe

Verwandte Themen