Problema de Performance ou Loop?

3 respostas
rodrigo.vedovato
package metodos;

import java.text.DecimalFormat;


public class MetodosCalculos {

	private static double numerador;
	private static double denominador;
	
	public double getNumerador(){
		return numerador;
	}
	
	public void setNumerador(double numerador){
		this.numerador= numerador;
	}
	
	public double getDenominador(){
		return denominador;
	}
	
	public void setDenominador(double denominador){
		this.denominador= denominador;
	}

	public static double mdc (double numerador, double denominador){
		
		double numMaior, numMenor;
		double resto = 0, resultado;
		double mdc=0;
		DecimalFormat num=new DecimalFormat("0");
		double count=0;
		
		if (numerador>denominador) {
			numMaior=numerador; numMenor=denominador;
		} else {
			numMaior=denominador; numMenor=numerador;
		}
		
		do {
			
			resultado=numMaior / numMenor;
			
			resultado=Double.parseDouble(num.format(resultado));
			resto = (resultado * numMenor) - numMaior;
			
		if (resto != 0) {
			if (resto > numMenor) {
				numMaior = resto;
			} else {
				numMaior = numMenor; numMenor = resto;	
			}
		} else {
			mdc = numMenor;
		}
		
		count++;
		System.out.println(count);
		
		} while (resto != 0);
		
		return mdc;
	}
	

}

Montei esse método para calcular o MDC de dois números distintos. Quando executo ele com números tipo 60 e 22, ele faz tudo normalmente, mas quando uso números maiores, tipo 2000 e 1755, ele demora muito para mostrar o resultado, eu coloquei um contador aí só pra ter uma noção de quanto tempo ele estava demorando.. com números pequenos, o contador chega a 5 no máximo, mas com os grandes ele ultrapassa 5.000.000

Isso é somente baixar performance ou tem algum problema no "do... while"??

Obrigado

3 Respostas

Paulo_Silveira

resultado=Double.parseDouble(num.format(resultado));

Essa linha é desnecessaria. Deve ajudar retirando ela.

Tem outras coisas erradas por ai, nao? Exemplo é que o resto nunca deveria ser menor que o numMenor… nao faz sentido

Esse count tem de dar bem baixo se voce usar o algoritmo euclidiano

rodrigo.vedovato

Pronto, já resolvi

O problema estava naquela última declaração “if” mesmo, o numMenor nunca vai ser menor que o resto

Eu fiz isso e deu certo com tudo mesmo

ps: o que seria algoritmo euclidiano?

Abdon

O algoritmo de Euclides busca encontrar o máximo divisor comum entre dois números inteiros diferentes de zero.

Criado 19 de fevereiro de 2008
Ultima resposta 19 de fev. de 2008
Respostas 3
Participantes 3