Semplificare numero razionale

di Anonimizzato9570 il
7 risposte
Ciao, dovrei creare una classe numero razionale, quindi un oggetto che possegga un numeratore, un denominatore e un insieme di operatori sovraccaricati utili per le operazioni aritmetiche tra gli oggetti stessi. Avrei bisogno di creare un metodo che ogni qual volta venga invocato il costrutttore della classe mi riduca il numeratore e il denominatore
ad esempio se istanzio un oggetto rationalNumber(2,4) dovrei ottenere 1/2.
Sto riscontrando problemi sull'algoritmo per la semplificazione, vi posto il mio codice:


rationalNumber reduce(int num, int den){
int max, min, temp;
max=(num>den) ? num: den;
if(max==num)
      min=den;
else min=num;
while((max%min)==0){
   max=max-min;
   if(max<min)
   temp=max;
   max=min;
   min=temp;

}

num=num/max;
den=den/max;

return nationalNumber(num,den);

}

cosa sbaglio?

7 Risposte

  • Intanto in fondo ritorni nationalNumber; se hai fatto copia incolla, per cui l'errore c'è anche nel programma, può darsi che il problema sia solo quello.
  • dvaosta ha scritto:


    Intanto in fondo ritorni nationalNumber; se hai fatto copia incolla, per cui l'errore c'è anche nel programma, può darsi che il problema sia solo quello.
    nono, l'ho riscritto a mano, e nel mio programma non mi ritornava il rational ma un intero ossia il min.
  • Ma intanto partiamo dal problema iniziale: per semplificare bisogna trovare il minimo comune multiplo e poi dividere entrambe i numeri per questo giusto?
  • poel ha scritto:


    ma intanto partiamo dal problema iniziale: per semplificare bisogna trovare il minimo comune multiplo e poi dividere entrambe i numeri per questo giusto?
    Non è il massimo comun divisore? altrimenti se cerchi il minimo comune multiplo almeno uno dei due numeri diventra frazionario (tipo 2/6 -> minimo comune multiplo=6 -> (2/6)/1=2/6 anziché 1/3).
  • Ho risolto così:
    void rational::reduce(){
    	cout<<"\n Prima della riduzione "<<num<<"/"<<den<<endl;
    	 int largest, mcd = 1;
    
    	 largest = ( num > den ) ? num: den;
    
    	 for ( int i = 2; i <= largest; ++i )
    	 if ( num % i == 0 && den % i == 0 )
    		mcd = i;
    
    		 num = num/mcd;
    		 den = den/mcd;
    			cout<<"\n dopo  la riduzione "<<num<<"/"<<den<<endl<<endl;
    
    		 }
    ma quindi quello è il MCD(massimo comun divisore) e non il mcm (minimo comune multiplo) ?
  • L'algoritmo funziona quando effettivamente c'è da semplificare, ma se immetto un numero come 17/2
    mi semplifica in 2/1
  • Anziché trovare il numero 'largest' dovresti trovare 'smallest' (largest lo cercavi per il minimo comune multiplo, che è un numero maggiore o uguale del maggiore tra i 2, col MCD è il contrario, dev'essere minore del minore (scusa il gioco di parole) per poterli dividere entrambi).
Devi accedere o registrarti per scrivere nel forum
7 risposte