PDA

View Full Version : [Java] Programma che gestisce numeri coprimi


Capua
16-04-2009, 19:43
Ho un errore di Stack OverFlow nel seguente programma:


public class Coprimi {
private int[] insieme;
private int cont = 0;

public Coprimi () {
insieme = new int [100];
}

public boolean aggiungi(int n) {
if(cont>100) {
System.out.println("troppi elementi nell'insieme");
return false;
}
if (mcd(n)!=1) return false;
else {
insieme[cont] = n;
cont++;
return true;
}
}

public int mcd (int n) {
int max=1;
for (int i=0;i<cont;i++) {
if (mcd2(insieme[i],n)>max) {
max = mcd2(insieme[i],n);
}
}
return max;
}

public static int mcd2 (int x,int y) {
if(x==0) return y;
else if (x < y) return (mcd2(y-x , y));
else return (mcd2(x , x-y));
}
}

public class TestCoprimi {
public static void main (String[] args) {
Coprimi numero1 = new Coprimi();
System.out.println(numero1.aggiungi(15));
System.out.println(numero1.aggiungi(14));
System.out.println(numero1.aggiungi(11));
System.out.println(numero1.mcd2(35,11));
}
}


Il testo dell'esercizio recita così:

Definire una classe Coprimi per gestire insiemi di numeri interi tra loro coprimi. Il costruttore inizializza l'insieme come vuoto. La classe ha due metodi aggiungi e mcd. Il metodo aggiungi prende come argomento un intero e se questo è coprimo con tutti i numeri nell'insieme lo aggiunge all'insieme e ritorna true, altrmenti non fa nulla e ritorna false. Il metodo mcd prende come argomento un intero e ritorna il massimo comun divisore tra l'intero e gli interi dell'insieme. Ad esempio se l'insieme è {15, 14, 11} e l'argomento è 35 allora il metodo ritorna 7.

wingman87
16-04-2009, 20:18
Rivedi il metodo mcd2, puoi trovare descrizione ed implementazione dell'algoritmo corretto qui: http://it.wikipedia.org/wiki/Algoritmo_di_Euclide

Inoltre in mcd fai inutilmente due chiamate uguali di mcd2, conviene salvare il risultato della prima in una variabile e poi usare quella.

PS: usa il tag code per mantenere l'indentazione sul forum