Allora:
1) minimo comune multiplo: OK (LCM)
2) massimo -> massimo divisore comune (GCD)
3) riduzione -> riduzione del numerotore, denominatore ai minimi termini.
Tanto per usare una terminologia comprensibile.
Iniziamo con la proprieta' banale: siano A, B due interi, e LCM(A,B) e GCD(A,B) rispettivamente 1) e 2), allora hai che:
A*B = LCM(A,B)*GCD(A,B)
La tua frazione A/B viene ridotta ai minimi termini quando hai:
(A / GCD(A,B)) / (B / GCD(A,B))
Il GCD lo puoi calcolare come hai inizialmente descritto, ma e' complicato, perche' devi cercare i fattori PRIMI del numero, e trovare i numeri PRIMI e' complicato.
Ad esempio, riduci ai minimi termini la seguente frazione:
1073741827 / 3221225473
(i numeri sono grandi, ma comunque rappresentabili mediante un intero a 32 bit)
oppure
4611686018427388039 / 27670116110564327479
(rappresentabili con interi a 64 bit).
Nota: io conosco la frazione ridotta ai minimi termini
Quindi se ti cimenti, e non sei sicuro del risultato, postalo e ti dico se e' corretto
Invece c'e' un modo DECISAMENTE piu' semplice, ed inventato qualcosa come 2300 anni fa : l'Algoritmo di Euclide
https://it.wikipedia.org/wiki/Algoritmo_di_Euclid
Piccola nota implementativa: la tua implementazione potrebbe anche andare bene, ma da un punto di vista filosofico no.
Il problema e' questo:
concettualmente una frazione e' un numero, come un intero, un numero in floating point, molto piu' simile ad una stringa,
cioe' un oggetto
immutabile: una volta che lo hai istanziato, quello e' e non cambia.
Quindi, quando crei una frazione, la crei GIA' con un numeratore ed un denominatore (che passi nel costruttore).
Tra l'altro, puoi anche non passare il denominatore, che sara', per default, 1,
Ed ovviamente devi controllare che il denominatore NON SIA MAI zero.
NON TI SERVONO I SETTER, mentre ti sono utili i GETTER.
Inoltre, la riduzione dovrebbe esser automatica.
Quindi, anche se tu scrivi:
frazione f;
f = frazione(1,2);
f = frazione(2,4);
f = frazione (4000000000,8000000000)
stai facendo riferimento SEMPRE alla frazione 1/2.
Poi ci sono altre cose strane:
tipo() non ritorna nulla, e quindi a che serve?
confronto() non ritorna nulla, e quindi come fai a conoscere il risultato del confronto?
perche' gli operatori +/-/*/.. sono funzioni? Implementali come operatori della classe
mancano le operazioni con gli interi (almeno int), e cioe' frazione+int, int+frazione, ecc
mancano gli operatori di confronto (==, !=, <, <=, >=, >) tra frazione ed frazioni/interi