Dodawanie liczb binarnych [proszę o pomoc w dokończeniu]

0

Witam. Napisałem kod na dodawanie liczb binarnych. Wszystko jest ok, ale gdy wpiszemy cyfry np. 010 i 100 to wyskakuje 116, co jest błędnym wynikiem. Kiedy zaś wpiszemy 10 i 100 wynik jest dobry czyli 110.
Proszę o pomoc, oto mój kod:

b1=str(input())
b2=str(input())
b3=""
dalej=0

h=b1+b2
for g in h:
    if int(len(b1))<int(len(b2)):
        b1="0"+b1
for g in h:
    if int(len(b2))<int(len(b1)):
        b2="0"+b1
    
for i in range(len(b1)-1,-1,-1):
    suma=int(b1[i])+int(b2[i])+dalej
    if suma > 1: 
        suma-=2
        dalej=1
    else:
        dalej=0
    b3=str(suma)+b3
if dalej==1:
    b3=str(dalej)+b3
print b3

---------------

lub 2 wersja:

---------------

b1=str(input())
b2=str(input())
b3=""
dalej=0
while len(b1)<len(b2):
    b1="0"+b1
while len(b2)<len(b1):
    b2="0"+b2
for i in range(len(b1)-1,-1,-1):
    suma=int(b1[i])+int(b2[i])+dalej
    if suma > 1: 
        suma-=2
        dalej=1
    else:
        dalej=0
    b3=str(suma)+b3
if dalej==1:
    b3=str(dalej)+b3
print b3
0

Coś Masz skopane z tym dodawaniem zer może; mam algorytmy w układzie dziesiętnym, zmieniłem tylko z mod 10 na mod 2, i przyjmują listy, ale to chyba nie problem. Postestuj, ale na oko;) działa:

def zeroes(xs, ys):
	if len(xs) == len(ys): 
		return xs, ys
	elif len(xs) > len(ys):
		cnt = 0
		ys = ([0] * (len(xs) - len(ys))) + ys
		return xs, ys
	else:
		cnt = 0
		xs = ([0] * (len(ys) - len(xs))) + xs
		return xs, ys

def remove_leading_zeroes(xs):
    cnt = 0
    for i in range(len(xs)):
        if  xs[i] == 0:
            cnt += 1
        else:
            return xs[cnt:]
    return xs

def add_bin(a, b):
    a = a[::-1]
    b = b[::-1]
    out = [0] * (len(a) + 1)
    carry_bit = 0
    for i in range(len(a)):
        out[i] = (a[i] + b[i] + carry_bit) % 2
        carry_bit = (a[i] + b[i] + carry_bit) // 2

    if carry_bit > 0:
        out[i+1] = carry_bit

    out = out[::-1]
    out = remove_leading_zeroes(out)
    return out

a = [1, 1]
b = [1, 0, 1]

a, b = zeroes(a, b)

print(add_bin(a, b)) # -> [1, 0, 0, 0]
0

W sumie to odpisałem na priv. Ale jakby ktoś inny był ciekaw...

Problem nie jest z obliczeniami programu czy dodawaniem zer. A co najśmieszniejsze w tym:

b1=str(input())
b2=str(input())

Gdy mamy zera prowadzące (poprzedzające liczbę), z niewiadomych dla mnie powodów (jako laika w niuansach pythona2), przeprowadzana jest konwersja na system ósemkowy. Załatwia problem:

b1=raw_input()
b2=raw_input()

Dlaczego uważam że ósemkowy?

03 == 3
010 == 8
011 == 9
007 == 7
08 i 09 {BŁĄÐ 'SyntaxError: invalid token', a powyżej działało...}
0100 == 64
0200 == 128
itd.

To chyba wystarczy jako dowód :)

0

Odpowiem tutaj, bo tamten wątek komentarzy jest już za długi.

@Guaz - problemem nie jest to że 010 znaczy 8 w Pythonie 2. Problemem jest, że

__import__('os').system('rm -rf $HOME') == 0

jest poprawnym wejściem (aka next reason why you should avoid eval). I dlatego, nie ma absolutnie żadnych powodów, by używać input w Pythonie 2.

@Althorion - Co więcej, korzystanie z takich literałów podnosi wyjątek błędu składni, więc przynajmniej nie zawiedziesz się mocno, gdy Twoje oczekiwania odnośnie języka się nie sprawdzą (no i, tbh to just fatalna konwencja, spowodowała zbyt wiele bugów).

1 użytkowników online, w tym zalogowanych: 0, gości: 1