Dodawanie liczb binarnych

Dodawanie liczb binarnych
Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Witam. Mam problem z napisaniem kodu na dodawanie liczb binarnych. Mianowicie chodzi o to, że program daje błąd w momencie gdy wpiszemy liczby o różnych cyfrach.
Oto mój kod:

Kopiuj
b1=str(input())
b2=str(input())
b3=""
dalej=0
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: Patryk27
Patryk27
Podaj dwie przykładowe liczby dające błędny wynik.
Dobry Zawodnik
1000 i 100 lub 100 i 1000
Patryk27
Zatem pytasz o dwie liczby o różnych długościach, a nie cyfrach (np. 100 vs 111) - dlatego pamiętaj, że istotne jest określanie przykładów.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Zauważ, że w przypadku dodawania dwóch liczb o różnych długościach musisz je do siebie wyrównać zerami wiodącymi, np.: 1000 + 100 = 1000 + 0100.


edytowany 2x, ostatnio: Patryk27
Dobry Zawodnik
tylko jak to zrobić, bo jak używam if(len(b1)<len(b2)) ... to wtedy nie działa
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Na temat odpowiadaj w postach ;-)

Pokaż jak próbowałeś wyrównać dwie liczby o różnych długościach zerami wiodącymi.


edytowany 2x, ostatnio: Patryk27
Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0
Kopiuj
if (len(b1))<(len(b2))
  ((len(b1))=(len(b1)+((len(b2))-(len(b1)))
edytowany 1x, ostatnio: Patryk27
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Dlaczego myślisz, że ten kod będzie wypełniał cokolwiek zerami wiodącymi? :-)
Btw, umieszczaj kod w odpowiednich znacznikach.


edytowany 1x, ostatnio: Patryk27
Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Znaczy wydaje mi sie, że będzie on dopełniał tą liczbę tak, aby ich długości cyfr były równe, ale żeby dopełniał zerami to tego nie mam pojęcia jak zrobić

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Wydaje mi się, że przeceniasz zdolności Pytona do czytania w myślach, bo ten kod niestety nie będzie robił nic ;-)

Co powiesz na coś takiego:

Kopiuj
while len(liczbaA) < len(liczbaB):
  liczbaA = "0" + liczbaA

edytowany 3x, ostatnio: Patryk27
Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Nie mogę zastosować while, ponieważ nie mieliśmy jeszcze tego na lekcji.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Cóż... w takim razie pomyśl jak przerobić to na for.


Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

A jeżeli bym już używal tego while to, w którym miejscu mam to wstawić, bo jak sobie teraz to wstawiłem to mi nie działa
*jestem początkujący dlatego z góry przepraszam jeżeli te pytania są głupie i bezsensowne

edytowany 1x, ostatnio: Dobry Zawodnik
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Dodawanie można podzielić na dwa etapy:

  • wyrównanie liczb do siebie,
  • wykonywanie dodawania.

Jeden z tych etapów masz już zakodowany.


Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Zakodowane mam wykonywanie dodawania, ale z tym wyrównaniem liczb mam problem

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1
Kopiuj
liczbaA = str(input())
liczbaB = str(input())

while len(liczbaA) < len(liczbaB):
  liczbaA = "0" + liczbaA

while len(liczbaB) < len(liczbaA):
  liczbaB = "0" + liczbaB

wynik = ""
przeniesienie = 0

for i in range(len(liczbaA)-1, -1, -1):
  # ...

edytowany 3x, ostatnio: Patryk27
Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

dziękuje bardzo, tylko teraz muszę przerobić to na for ale to już spróbuje samemu

Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Jest w ogóle to możliwe żeby to przenieść na for?

Guaz
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Częstochowa
  • Postów:221
1

A ja bym zera uzupełnił pythonowo wbudowaną metodą dla str, tak:

Kopiuj
if len(b1) > len(b2):
    b1 = b2.zfill(len(b1)
elif len(b1) < len(b2):
    b2 = b1.zfill(len(b2)

lub od razu tak:

Kopiuj
b1.zfill(len(b2))
b2.zfill(len(b1))

@Edit:

Kopiuj
>>> b1 = "100"
>>> b2 = "1000"
>>> b1.zfill(len(b2))
'0100'
>>> b2.zfill(len(b1))
'1000'
>>> b1 #Dopóki nie przypiszemy, jest niezmieniony
'100'
>>> b2 = b2.zfill(len(b1))
'1000'
>>> b1 = b1.zfill(len(b2))
'0100'
>>> b1
'0100'
>>> b2
'1000'

Chociaż według mnie nie po to są wbudowane metody do binarki w pythonie, żeby ich nie wykorzystywać i całość można rozwiązać w ten sposób:

Kopiuj
b1=int(input(), 2)
b2=int(input(), 2)
b3=bin(b1+b2)
print b3

Linux Mint
Arduino / Python 3.5.2
edytowany 2x, ostatnio: Guaz
Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Nie mam pojęcia co robi .zfill

Zobacz pozostały 1 komentarz
Dobry Zawodnik
wiesz moze jak to przerobić na for?
Guaz
W edit w powyższym poście pokazałem jak to działa :)
Dobry Zawodnik
a i chciałem zaznaczyć, że jak używam tego 3 sposobu twojego to mi błąd wyskakuje line 1, in <module> b1=int(input(),2) TypeError: int() can't convert non-string with explicit base
Guaz
Zaraz pomyślę.
Guaz
Ah, w takim razie używasz python2. Tam też się jakoś to robiło, ale niestety nie pamiętam jak :D.
Guaz
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Częstochowa
  • Postów:221
0

Wersja z for:

Kopiuj
for lead_zeros in range(abs(len(b1)-len(b2))): #Pętla wykona się tyle razy ile wynosić będzie wartość bezwzględna z odejmowania
    if len(b1) > len(b2):
        b2 = "0"+b2
    else: #W takim forze, jeden z warunków < lub > musi wystąpić, więc można dać else, pętla nie wykona się więcej razy niż potrzeba.
        b1 = "0"+b1

Linux Mint
Arduino / Python 3.5.2
Dobry Zawodnik
abs to wartość bezwzględna tak?
Guaz
Tak, gdyby akurat wyszło że pierwsza liczba jest 'krótsza' od drugiej.
Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

A ja zrobilem tak:

Kopiuj

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

lista=b1+b2
for g in lista:
    if int(len(b1))<int(len(b2)):
        b1="0"+b1
for g in lista:
    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
Visual Code
a = '1' b = '11' c = bin(int(a,2) + int(b,2))
Guaz
@Visual Code: To już pisałem wyżej :).
Guaz
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Częstochowa
  • Postów:221
0
Kopiuj
Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> int("01001", 2)
9
>>> bin(9)
'0b1001'

W pythonie2 też działa ta metoda :).
Musiałeś jakoś źle wpisać.


Linux Mint
Arduino / Python 3.5.2
Dobry Zawodnik
no tak wpisalem bez " sorry
enedil
Oczywiście, bo wykonywał to na wyniku input(), który w dwójce odpowiada takiemu kodowi z trójki: eval(input()).
Guaz
Fakt, teraz sprawdziłem, w python2 przy input to powinno wyglądać tak: int(str(input()), 2)
Dobry Zawodnik
Możesz pomóc, bo jak wpiszemy liczbę 010 i 10 to nie działa
enedil
Nie, powinno wyglądać tak: int(raw_input(), 2).
Dobry Zawodnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Kolejne zagadnienie, co zrobić kiedy wpiszemy np liczbę 010 i 10, bo wtedy nie dziala program :D

Guaz
Jeśli kod twojego programu wygląda jak ten który wkleiłeś ostatnio, powinno działać. A jeśli nie działa, to wyrzuca jakiś error lub coś? Najlepiej przeleć program krok po kroku tym: pythontutor.com

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.