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

Odpowiedz Nowy wątek
2018-11-13 22:13
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
edytowany 3x, ostatnio: Dobry Zawodnik, 2018-11-13 22:16

Pozostało 580 znaków

2018-11-14 00:18
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]

Pozostało 580 znaków

2018-11-14 01:46
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 :)


Linux Mint
Arduino / Python 3.5.2
edytowany 3x, ostatnio: Guaz, 2018-11-14 01:48
Jest ogólnie przyjętą konwencją, której trzyma się i Python, że liczby dziesiętne zapisuje się „normalnie”, szesnastkowe mają prefix 0x, a ósemkowe 0. Mniej przyjętą konwencją jest prefiks 0b dla binarnych. - Althorion 2018-11-14 12:19
Możesz sobie bezpośrednio w konsoli Pythona sprawdzić zresztą — 010 == 8 itd. Swoją drogą, trzeci Python z tego rezygnuje i teraz poprawny prefiks to 0o. - Althorion 2018-11-14 12:21
Dzięki za wytłumaczenie :D. Jak mówiłem, nie znam się na kwiatkach z pythona2. Ale dobrze coś poznać ^^ - Guaz 2018-11-14 13:06
Ja zaczynałem jeszcze za czasów 2.4. Ale to jest ogólnie popularna konwencja (tzn. oznaczenie 012345 jako liczby ósemkowej, równej 5349) i tego bym się spodziewał po nieznanym sobie języku programowania. - Althorion 2018-11-14 13:13

Pozostało 580 znaków

2018-11-15 01:57
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).

edytowany 1x, ostatnio: enedil, 2018-11-15 01:58
Cóż... Wszyscy kochają injection :D. Ale w takim wypadku nie dziwie się dlaczego z reguły właśnie widywałem raw_input(). Dzięki za wyjaśnienie. PS: Przykład piękny ^^, nic tak nie budzi jak usunięcie zawartości HOME albo głównej tabeli w bazie danych :) - Guaz 2018-11-16 02:48

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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