Fração na forma reduzida

9 respostas
Mavericks

Galera to com um probleminha de lógica, preciso criar um método que armazena frações na forma reduzida, ou seja 2/4 fica 1/2, 3/9 fica 1/3, etc.
Até consigo fazer isso se definir i como 2 ou 3, mas queria fazer algo mais geral que permitar usar esse método para qualquer valor de entrada na fração.

Segue o código:

public class Rational{
	private int denominador; //recebe o valor do denominador
	private int numerador; //recebe o valor do numerador
	private int result; //recebe o resultado da operação
	
	public void construtor (int nume , int deno){
		int i = 1;
		while(nume%i == 0 && deno%i == 0){
			while (nume%i == 0){ 
								
				nume = nume / i;
				deno = deno / i	;
				System.out.println(nume + "/" + deno);	
			}	
			i++;
			
		}
	}
}

9 Respostas

maquiavelbona

Aulas de Álgebra I -> divisibilidade -> MDC
Com isso, você consegue o que você quer.

Até!

M

Olá, será que é mais ou menos isso?
Não refatorei, trabalhe em cima do seu código pra ver se ajuda.
Abraços.

public class Divisao {

	public void montaFracao(int numerador, int denominador) {
		int i = 1;
		while ((numerador % i == 0 && denominador % i == 0)
				|| ((numerador > 1 && denominador > 1) && i <= numerador)) {

			if (i > 1) {
				while (numerador % i == 0 && denominador % i == 0) {
					numerador = numerador / i;
					denominador = denominador / i;
					System.out.println(numerador + "/" + denominador);
				}
			} else {
				System.out.println(numerador + "/" + denominador);
			}
			i++;
		}
	}

	public static void main(String[] args) {
		new Divisao().montaFracao(3230000, 450000);
	}
}
Mavericks

Tem algum método que faz isso?

ViniGodoy

É mais eficiente usar o método das divisões sucessivas:

CÁLCULO DO M.D.C. PELO PROCESSO DAS DIVISÕES SUCESSIVAS

Nesse processo efetuamos várias divisões até chegar a uma divisão exata. O divisor desta divisão é o m.d.c. Acompanhe o cálculo do m.d.c.(48,30).

Regra prática:

1º) dividimos o número maior pelo número menor: 48 / 30 = 1 (com resto 18 )
2º) dividimos o divisor 30, que é divisor da divisão anterior, por 18, que é o resto da divisão anterior, e assim sucessivamente:
30 / 18 = 1 (com resto 12)
18 / 12 = 1 (com resto 6)
12 / 6 = 2 (com resto zero - divisão exata)

3º) O divisor da divisão exata é 6. Então m.d.c.(48,30) = 6.

Fonte: http://www.somatematica.com.br/fundam/mdc.php

Eu já vi uma implementação recursiva desse algoritmo no livro Mathematics and Physics for Programmers, do Kodicek.

M

Você quer mostrar as frações sendo reduzidas ou apenas mostrar o valor de MDC?

Mavericks

Valeu…

Mavericks

Quero apenas reduzir frações, o seu código funcionou perfeitamente, valeu Mauro e todos os outros brothers que ajudaram.

maquiavelbona

ViniGodoy:
É mais eficiente usar o método das divisões sucessivas:

CÁLCULO DO M.D.C. PELO PROCESSO DAS DIVISÕES SUCESSIVAS


Ou quem quiser procurar, procurem por Algoritmo de Euclides.

Até!

Alkamavo
public class Rational{  

        private int denominador; //recebe o valor do denominador  
         private int numerador; //recebe o valor do numerador  
         private int result; //recebe o resultado da operação  
           

		public int greatestCommonDivisor(int a, int b) {

			if (b == 0)
				return a;
			else
				return greatestCommonDivisor(b, a % b);
		}
	

         public void construtor (int nume , int deno){  
           int i = 1;  
             while(nume%i == 0 && deno%i == 0){  
                while (nume%i == 0){   
                                      
                    nume = nume / i;  
                    deno = deno / i ;
                    int mdc =greatestCommonDivisor(nume, deno);
                    
                    int num_final=nume/mdc;
                    int den_final=deno/mdc;
                    
                    System.out.println(num_final + "/" + den_final);    
                }     
                i++;  
                  
            }  
        }
    }
Criado 23 de abril de 2008
Ultima resposta 24 de abr. de 2008
Respostas 9
Participantes 5