Progetto divisione tra interi relativi

di il
2 risposte

Progetto divisione tra interi relativi

Salve ragazzi, vorrei chiedervi prima di tutto se sono nella sezione giusta per postare una domanda del genere.
Il prof mi ha detto di creare un programma in Assembler che faccia la divisione tra numeri interi relativi in complemento a 2 in IJVM, con il seguente testo del problema:
Metodo per la divisione dei due valori relativi in modulo e segno al TOS tramite istruzioni IJVM . Il metodo deve implementare il metodo manuale delle divisioni “in colonna” e non semplicemente sottrarre al dividendo il divisore successivamente fino a che diventi minore del divisore stesso.

Ora prima di postarvi il codice, vi dico che solitamente al 99% degli orali che ha fatto non gli andava bene il metodo utilizzato e ne chiedeva un altro del tipo:
"ok come l'hai fatto tu va bene ma ci sarebbe arrivata anche una scimmia.. ora trovami un altro metodo per risolvere il problema, non voglio il codice ma solo la semplice spiegazione di cosa farai..."

capito!!! e se non la sai ti rimanda a posto arrivederci al prossimo appello..

Io l'ho risolto normalmente riproducendo a livello binario lo stesso tipo di procedimento che si mette in atto eseguendo una normale divisione decimale a mano su un foglio di carta. Questo consiste nell'allineare le cifre del divisore a sinistra sotto il dividendo, effettuare una sottrazione per vedere se il divisore e' maggiore del dividendo, segnarsi uno 0 nel caso in cui lo sia e un 1 nel caso in cui non lo sia, dopo di che shiftare il divisore a destra di una posizione e ripetere l'operazione. Gli 0 e gli 1 che si ottengono come risultato della sottrazione si aggiungono mano a mano sulla destra del quoziente facendolo scorrere verso sinistra. Dopo n+1 cicli (dove n e' il numero di spostamenti effettuati all'inizio per allineare il divisore a sinistra) nel quoziente si trova il risultato della divisione, e nel dividendo risulta presente il resto (0 se il divisore e' un sottomultiplo intero del dividendo). Con questo procedimento verranno eseguite al massimo n+1 sottrazioni. E' inutile ricordare che una divisione per zero e' un' operazione impossibile e va assolutamente evitata.

Se mi chiedesse un altro metodo?

Grazie

2 Risposte

  • Re: Progetto divisione tra interi relativi

    Finalmente uno che non chiede codice.
    allora per affrontare il tuo problema ci sono almeno altri 2 sistemi :
    I) prendi il dividendo e lo sottrai al divisore fino a quando il divisore non diventa più piccolo del dividendo quando ciò si verifica quello e il resto. (questo a livello informatico e il più facile)
    II) rispolveri le vecchie elementari cioè :
    trovi il numero che moltiplicato per il dividendo ti da il divisore
    fai la moltiplicazione e sottrai il risultato
    a quel punto vedi se ci sono altre cifre d'abbassare e se ci sono le abbassi
    e vai a trovare un altro numero.
    quando tutte le cifre sono finite l'ultimo risultato della sottrazione sarà il resto.
    esempio :
    12345 : 12
    abbasso il 12 e faccio 12:12 che mi da 1 con resto di 0
    abbasso 3 e faccio 3:12 che mi da 0 con resto di 3
    abbasso il 4 e faccio 34:12 che mi da 2 con il resto di 10
    abbasso il 5 e faccio 105 : 12 che mi da 8 con resto di 9
    a questo punto non ho più cifre da abbassare e quindi avro il risultato di 1028 con resto di 9

    non credo che il tuo professore abbia da ridire su quest'ultimo metodo quanto meno non è comune.
    e se anche avesse da ridire a questo punto te lo fai suggerire da lui.

    spero di esserti stato di aiuto.
  • Re: Progetto divisione tra interi relativi

    Grazie smalldragon.. non ci speravo più dopo più di 1 mese e mezzo dal post..

    Allora come ho già scritto:
    Metodo per la divisione dei due valori relativi in modulo e segno al TOS tramite istruzioni IJVM . Il metodo deve implementare il metodo manuale delle divisioni “in colonna” e non semplicemente sottrarre al dividendo il divisore successivamente fino a che diventi minore del divisore stesso

    in pratica tu mi dai 2 soluzioni ma non sei d'aiuto perchè purtroppo:
    -la prima è quella che il professore esplicitamente dice di non applicare!
    -la seconda è quella che ho scritto io nel primo post!

    Grazie ugualmente

    Nel frattempo ho trovato un altro metodo che potrebbe andare bene...
    Prendo il divisore, controllo che non sia 0.
    Lo confronto con il dividendo, se uguale pongo il quoziente =1, se minore del dividendo lo sommo a se stesso aggiornando il nuovo numero in una variabile chiamata parziale e aggiorno un contatore a +1 che sarà il mio quoziente, poi rifaccio il controllo e riaggiorno finchè non arrivo alla situazione in cui il divisore è maggiore del dividendo.
    A quel punto avrò il quoziente che moltiplicato per il divisore mi darà un numero più grande del dividendo quindi non andrebbe bene allora
    il quoziente sarà il contatore - 1
    il resto lo troverò facendo (dividendo-(parziale-divisore)).

    Potrebbe essere una soluzione

    Es. 2134:53 = 40 con resto 14
    dividendo = 2134
    divisore = 53
    parziale = 0
    n = 0

    inizio ciclo for
    n= n+1
    parziale=parziale + divisore
    confronto dividendo con parziale
    loop

    if dividendo=parziale then
    begin
    quoziente= n
    resto = 0
    end;

    else
    if dividendo<parziale
    begin
    quoziente = n-1
    parziale=parziale-divisore
    resto=divisore-parziale
    end;


    alla fine si esce con
    quoziente = n-1 = 40 e
    resto= dividendo-[parziale - divisore] = 2134-(2173-53)= 2134-2120= 14 resto
Devi accedere o registrarti per scrivere nel forum
2 risposte