Topic: somma binaria tra due numeri  (Letto 755 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline mari98

  • python unicellularis
  • *
  • Post: 22
  • Punti reputazione: 0
    • Mostra profilo
somma binaria tra due numeri
« il: Febbraio 06, 2018, 20:42 »
un esercizio  mi chiede:
definire una funzione che riceva in input due numeri
num1=0111001  ; num2=0011100
e restituisca in output la somma dei due numeri

Non riesco a capire come si fa.Qualcuno mi può aiutare

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.869
  • Punti reputazione: 9
    • Mostra profilo
Re:somma binaria tra due numeri
« Risposta #1 il: Febbraio 06, 2018, 21:20 »
Beh, se è un esercizio un pochino si suppone che tu debba almeno provarci, a capire come si fa.
Ora, devi immaginare che i numeri in input ti arrivino sotto forma di stringhe, (tipo val = "0101"), perché se fosse sotto forma di integer (tipo val = 101 ovviamente python li considera interi in base 10, non in base 2.
Detto questo, naturalmente python ha già un modo "incorporato" di convertire numeri in base 2 espressi come stringhe in interi in base 10 e viceversa. Potresti convertire i due numeri che ricevi in input, fare la somma in base 10, e ri-convertire in base 2. Questo è quello che si fa di solito. Non so però se, considerando che è un esercizio, questa cosa è possibile oppure è considerata una scorciatoia inammissibile.

Se non puoi semplicemente convertire, allora dovresti proprio fare la somma binaria "a mano". Puoi andare per gradi: prima prova a scrivere una funzione che accetta come input soltanto 2 "bit" (ovvero stringhe da un solo carattere, "0" o "1"), e restituisce la somma (sempre sotto forma di stringa). Poi ti accorgerai che devi includere un possibile riporto... Poi puoi usare questa funzione per sommare via via tutte le cifre dei tuoi due numeri in input.

Offline mari98

  • python unicellularis
  • *
  • Post: 22
  • Punti reputazione: 0
    • Mostra profilo
Re:somma binaria tra due numeri
« Risposta #2 il: Febbraio 06, 2018, 23:01 »
def sommabinari(num1,num2):
    n=len(num1)-1
    y=0
 
    for i in num1:
        v=2**n
        y+=(i*v)
        n-=1
    s=len(num2)-1
    x=0
    for j in num2:
        l=2**s
        x+=(j*l)
        s-=1
    N=x+y
   
    num3=[]
    while N!=0:
       
        resto=N%2
        N=N//2
        num3.append(resto)
    return num3
num1=[0,1,1,1,0,0,1]
num2=[0,0,1,1,1,0,0]
print(sommabinari(num1,num2))

       
Ho provato così e funziona. E' giusto?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.869
  • Punti reputazione: 9
    • Mostra profilo
Re:somma binaria tra due numeri
« Risposta #3 il: Febbraio 07, 2018, 10:27 »
No, non funziona neanche alla lontanissima.
In primo luogo l'esercizio ti chiede quasi certamente di passare i numeri binari come stringhe, non come liste di interi. Quindi dovresti scrivere una funzione che lavora così:

>>> sommabinaria("0111001", "0011100")
"1010101"

Come del resto ti avevo già spiegato. COMPLIMENTI per aver letto con attenzione il mio post qui sopra.

In secondo luogo, la tua funzione ovviamente funziona solo per numeri di pari lunghezza, ma dovrebbe coprire anche situazioni come:

>>> sommabinaria("0111001", "10")


Comunque, per il momento diciamo pure che questi due problemi (i numeri devono essere stringhe, non liste; i numeri devono poter avere lunghezza diversa) non li prendiamo in considerazione. Accettiamo pure di avere numeri come liste di interi, e sempre della stessa lunghezza (e con il comodo "zero" iniziale, ovviamente!).

Anche così però, il problema più grave è che la tua soluzione funziona miracolosamente per i due numeri dell'esercizio, ma fallisce in un sacco di altri casi.
Facciamo così (che è quello che poi si dovrebbe sempre fare, capisci: t-e-s-t-a-r-e il codice che si scrive): alla fine del modulo dove hai scritto la tua soluzione, aggiungi questo:


def test():
    test_cases = (
            # a        +      b        =       res
            ([0],             [0 ],            [0 ]),
            ([0, 1],          [0, 1],          [1, 0]),
            ([0, 1, 1],       [0, 1, 0],       [1, 0, 1]),
            ([0, 1, 1, 1],    [0, 1, 0, 0],    [1, 0, 1, 1]),
            ([0, 1, 1, 1],    [0, 1, 1, 1],    [1, 1, 1, 0]),
            # il tuo esempio:
            ([0,1,1,1,0,0,1], [0,0,1,1,1,0,0], [1, 0, 1, 0, 1, 0, 1]),
            #
            # per i seguenti la sua soluzione semplicemente
            # non funziona. Ma dovresti coprire anche questi:
            #
            # ([1],           [1],             [1, 0]),
            # ([1, 0, 1],     [1, 1],          [1, 0, 0, 0]),
            # ([1, 0],        [1],             [1, 1]),
            )
    for a, b, res in test_cases:
        s = sommabinari(a, b)
        print(a, b, s, res, s==res)

if __name__ == '__main__':
    test()


Adesso, riscrivi e correggi la tua soluzione fin quando tutti i test non restituiscono "True".
« Ultima modifica: Febbraio 07, 2018, 10:31 da RicPol »

Offline mari98

  • python unicellularis
  • *
  • Post: 22
  • Punti reputazione: 0
    • Mostra profilo
Re:somma binaria tra due numeri
« Risposta #4 il: Febbraio 07, 2018, 15:54 »
se scrivo i numeri come stringhe come li converto in base 10?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.869
  • Punti reputazione: 9
    • Mostra profilo
Re:somma binaria tra due numeri
« Risposta #5 il: Febbraio 07, 2018, 16:21 »
Te l'ho detto, NON li converti in base 10, altrimenti l'esercizio diventa inutile. Li leggi, vero, i post che scrivo per te?
Devi lavorare con le stringhe.

Poi per carità, se il tuo prof ti permette di cavartela copiando la formuletta, buon per te, hai più tempo da dedicare a facebook. Ecco qua la formuletta:

def binary_sum_with_conversion(a, b):
    return '{0:b}'.format(int(a, 2) + int(b, 2))

Copiala giusta, e vedrai che passa tutti i test di cui sopra.

Offline mari98

  • python unicellularis
  • *
  • Post: 22
  • Punti reputazione: 0
    • Mostra profilo
Re:somma binaria tra due numeri
« Risposta #6 il: Febbraio 07, 2018, 17:02 »
Ancor prima di vedere la tua risposta avevo provato a farlo cosi
def sommabinari(num1,num2):
   
    num1base10=int(num1, base=2)
    num2base10=int(num2, base=2)
    num3=num1base10+num2base10
    s=bin(num3)
    return s
num1="0111001"
num2="0011100"
print(sommabinari(num1,num2))


purtroppo tempo per facebook non ne ho.
 ti ringrazio per l'aiuto comunque

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.869
  • Punti reputazione: 9
    • Mostra profilo
Re:somma binaria tra due numeri
« Risposta #7 il: Febbraio 07, 2018, 17:48 »
Eh sì, solo che bin restituisce il numero binario sotto forma di stringa formattata in modo "strano", con lo "0b" iniziale. Dovresti toglierlo, se vuoi che l'output abbia lo stesso formato dell'input.
Comunque, ripeto. Questa è la soluzione ovvia. L'esercizio andrebbe risolto lavorando con le stringhe, senza conversioni.