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

Dodawanie liczb binarnych [proszę o pomoc w dokończeniu]
Dobry Zawodnik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
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:

Kopiuj
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
lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
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:

Kopiuj
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]
Guaz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Częstochowa
  • Postów: 220
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:

Kopiuj
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:

Kopiuj
b1=raw_input()
b2=raw_input()

Dlaczego uważam że ósemkowy?

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

enedil
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1028
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

Kopiuj
__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).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.