PDA

Visualizza versione completa : C#


tr0tj
14-11-2008, 17.30.35
Salve vorrei sviluppare un programma che calcoli il mcm xrò nn so da dove partire xchè mi servirebbero delle nozioni riguardanti gli esponenti :wall:

Semi.genius
14-11-2008, 19.02.37
basta una formula tail-ricorsiva del massimo comun divisore (la formula euclidiana) e dividere il prodotto dei due due numeri per il MCD

ad esempio per due numeri
int MCD(int a, int b){
if (a==b) return a;
else
if (a>b) return MCD(a-b, b);
else return MCD(a, b-a);
}

int mcm(int a, int b){
if (a== 0 && b==0)
return 0;
else
return (int)Math.abs(a) * (int)Math.abs(b) / MCD(a,b)
}

dovrebbe essere sufficiente.

Se devi fare di un vettore, lavora a coppia di due o applica un algoritmo di branch and bound, ad esempio per ottimmizzare le operazioni

tr0tj
14-11-2008, 19.41.59
si ho letto la tua formula xrò vorrei meglio capire alcuni pezzi come return a return b e poi il Math.abs

Semi.genius
14-11-2008, 21.50.57
Allora comuncio dalla funzione MCD...
è ricorsiva, ossia richiama se stessa: ciò consente di compattare il codice.

nel caso che a è uguale a b, è ovvio che il massimo comun divisore è uno dei due. Nel caso che è diverso si vede se è maggiore o minore.

La formula ecluidiana: http://it.wikipedia.org/wiki/Algoritmo_di_Euclide consente di riscrivere la formula in due modi tra cui uno che ho scritto.

La mcm utilizza questa formula per eliminare il massio divisore comune perciò non ci sono multipli tra di loro che non il loro minimo.

(int)Math.Abs(x) calcola il valore assoluto del valore (i termini dovrebbe essere senza segno, ma non è proprio necessario) e viene castato come int (perché Math.Abs ritorna un double).

tr0tj
16-11-2008, 13.24.23
grz della spiegazione io ho letto anche su wiki il fatto di questa formula xrò il prog nn mi funziona nn è che x caso potresti postarmi il codice esatto per c# con tt le variabili e poi me lo analizzo? grz mille

Semi.genius
16-11-2008, 13.28.50
grz della spiegazione io ho letto anche su wiki il fatto di questa formula xrò il prog nn mi funziona nn è che x caso potresti postarmi il codice esatto per c# con tt le variabili e poi me lo analizzo? grz mille

Non puoi postare il tuo codice e gli errori generati? è sempre meglio correggere il proprio codice sorgente che imparare quello degli altri.

tr0tj
16-11-2008, 13.59.44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mcm
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Inserisci Numero");
int numero1 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Inserisci Numero2");
int numero2 = Convert.ToInt32(Console.ReadLine());
int resto = numero1 % numero2;
int mcd;
int mcm;
if (numero2 == 0)
{
mcd = numero1;
}
else
{
if (resto == 0)
mcd = numero2;
else
while(resto==0)
mcd = numero2 % resto;
}

Console.WriteLine(mcd);
}

}
}
questo il mio codice sorgente

Semi.genius
16-11-2008, 14.45.03
int mcd;
if (resto == 0)
mcd = numero2;
else
while(resto==0)
mcd = numero2 % resto;

è un contro senso perché
SE Resto == 0
ALLORA mcd=numero2
ALTRIMENTI FINCHé RESTO ==0 FAI
MCD= RESTO DI (numero 2 / Resto)


Non farà mai quel ciclo while perché resto non sarà mai uguale a zero nella clausola altrimenti perciò non calcolerai l'MCD giusto solo nel caso in cui due numeri sono uguali.

dovresti far così senza ricorsione:

NUM2=NUMERO2
NUM1=NUMERO1
(sono assegnazioni, eh)
FINCHè NUM2 != 0 FAI
T = NUM2
NUM2 = RESTO DI (NUM1/NUM2)
NUM1 = T

STAMPA MCD
MCM = NUMERO2 * NUMERO1 / MCD
STAMPA MCM

in termini algoritmici

tr0tj
16-11-2008, 16.24.40
un ultimo aiuto ho quasi finito xchè il mcm me lo fa correttamente xrò scrive infinite volt sullo schermo il risultato guarda questo codice e poi mi dice utilizzo della variabile mcd nn assegnata :)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Mcm
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Inserisci Numero");
int numero1 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Inserisci Numero2");
int numero2 = Convert.ToInt32(Console.ReadLine());
int mcd;
int mcm;
while(numero2!=0)
{
if (numero1 != numero2)
{

int divisione = numero1 / numero2;
int resto = numero1%numero2;
if (resto == 0)
{
mcd = numero2;
}
else
{
numero1 = numero2;
numero2 = resto;

}
mcm = numero1 * numero2 / mcd;
Console.WriteLine("Il Minimo Comune Multiplo è {0}",mcm);
}
}


}

}
}

Semi.genius
16-11-2008, 16.48.41
Te lo stampa tot volte perché hai lasciato il calcolo della mcm e la console.write nel ciclo while. quando usi una variabile all'interno di un ciclo devi preinizializzarla, quindi ad esempio metti int mcd=0; (ho lasciato lo spazio per separarlo dal while siccome qui nel forum non posso mettere tabulazioni)

tr0tj
16-11-2008, 19.01.19
ho fatto questo x levare mcm e write da ciclo while


while(numero2!=0)
{
if (numero1 != numero2)
{
int divisione = numero1 / numero2;
int resto = numero1 % numero2;
if (resto == 0)

mcd = numero2;

else
{
numero1 = numero2;
numero2 = resto;
}
{
break;
}
mcm = numero1 * numero2 / mcd;
Console.WriteLine("Il Minimo Comune Multiplo è {0}", mcm);
{
continue;
}
}

}


xrò mi dice che mcm è una porzione di codice nn eseguibile nn capisco il xchè con break e continue si dovrebbe interrompere il ciclo while...

Semi.genius
16-11-2008, 19.06.38
il break e continue lì non hanno senso non è raggiungibile perché sono sia in blocchi diversi perciò il break e il continue non può spezzare o continuare il ciclo. Non vanno raccolte tra grafe. Non usare break e continue, semplicemente dopo la graffa del while, piazzi quelle due istruzioni

Poi un altro errore è che nel ciclo modifichi gli originali numero1 e numero2, perciò quando fai il prodotto con l'mcm non sono attendibili, ti conviene copiarli in altri due variabili fuori dal ciclo e danne all'algoritmo in pasto solo una coppia di essi e con l'altra calcoli mcm.

tr0tj
16-11-2008, 19.06.40
un altra domanda se metto come numeri 4 e 5 mi da un errore di divisione x zero.. avrò sbagliato qualcosa riguardante il Massimo Comun Divisore

tr0tj
19-11-2008, 18.59.47
scusa ho riguardato praticamente il codice quello tail ricorsivo e mi chiedo una cosa (xchè ho guardato anche su wikipedia) il codice praticamente dice se a = 1 b =1 a =b il Massimo Comun Divisore è a altrimenti fa praticamente 2 sottrazione numero1-numero2 e viceversa nn so penso che nn abbia senso....

tr0tj
19-11-2008, 19.26.44
guarda qua ho fatto questo prog se tu mentalmente sostiusci i numeri funziona xrò il pc mi da un altra cosa forse sbaglio nel dichiarare il mcm dacci un occhiata please


namespace Mcm
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Inserisci Numero");
int numero1 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Inserisci Numero2");
int numero2 = Convert.ToInt32(Console.ReadLine());
int mcd = 1;
int mcm = (numero1 * numero2)/ mcd;
while (numero2 != 0)
{
mcd = numero2;
numero2 = numero1 % numero2;
numero1 = mcd;
}
Console.WriteLine(mcm);