|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
14-11-2008, 16.30.35 | #1 |
Junior Member
Registrato: 06-06-2008
Loc.: alcamo (tp)
Messaggi: 180
|
C#
|
14-11-2008, 18.02.37 | #2 |
Guest
Messaggi: n/a
|
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 |
14-11-2008, 18.41.59 | #3 |
Junior Member
Registrato: 06-06-2008
Loc.: alcamo (tp)
Messaggi: 180
|
si ho letto la tua formula xrò vorrei meglio capire alcuni pezzi come return a return b e poi il Math.abs
|
14-11-2008, 20.50.57 | #4 |
Guest
Messaggi: n/a
|
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). |
16-11-2008, 12.24.23 | #5 |
Junior Member
Registrato: 06-06-2008
Loc.: alcamo (tp)
Messaggi: 180
|
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
|
16-11-2008, 12.28.50 | #6 | |
Guest
Messaggi: n/a
|
Quota:
|
|
16-11-2008, 12.59.44 | #7 |
Junior Member
Registrato: 06-06-2008
Loc.: alcamo (tp)
Messaggi: 180
|
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 |
16-11-2008, 13.45.03 | #8 |
Guest
Messaggi: n/a
|
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 Ultima modifica di Semi.genius : 16-11-2008 alle ore 13.50.44 |
16-11-2008, 15.24.40 | #9 |
Junior Member
Registrato: 06-06-2008
Loc.: alcamo (tp)
Messaggi: 180
|
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); } } } } } |
16-11-2008, 15.48.41 | #10 |
Guest
Messaggi: n/a
|
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)
|
16-11-2008, 18.01.19 | #11 |
Junior Member
Registrato: 06-06-2008
Loc.: alcamo (tp)
Messaggi: 180
|
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... |
16-11-2008, 18.06.38 | #12 |
Guest
Messaggi: n/a
|
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. |
16-11-2008, 18.06.40 | #13 |
Junior Member
Registrato: 06-06-2008
Loc.: alcamo (tp)
Messaggi: 180
|
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
|
19-11-2008, 17.59.47 | #14 |
Junior Member
Registrato: 06-06-2008
Loc.: alcamo (tp)
Messaggi: 180
|
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....
|
19-11-2008, 18.26.44 | #15 |
Junior Member
Registrato: 06-06-2008
Loc.: alcamo (tp)
Messaggi: 180
|
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); |
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
|
|