Fatorar raízes

7 respostas
A

Estou criando um aplicativo andorid e estou com um problema:
Se eu tenho √80 eu preciso que ela seja fatorada para 4√5 utilizando MMC, alguém pode me ajudar?
EX:
80|2 \ 2²
40|2 /
20|2 \ 2²
10|2 /
5|5 > 5
1|

√2².2².5
2.2√5
4√5

7 Respostas

I

Olá amigo, fiz um método bem básico. Ele realiza a fatoração, porém não realiza a fatoração de números sem que a divisão de um pelo outro não seja exata. Ex.: "²√2³", ele poderia fatorar para "2 ²√2", mas ele só irá fatorar números com divisões corretas. Ex.: "²√2²", ou elevado na quatro, ou seis ou oito. Fiz no programa para que você possa alterar o grau da raiz podendo ser qualquer um, e não somente quadrada(²).
Para realizar a outra fatoração Ex.: "²√2³", vai dar um pouco mais de trabalho, porém não é difícil, você apenas precisa seguir a lógica que criei. Teste o programa, pois testei algumas entradas e as mesmas funcionaram. Segue o código.

import java.util.*;


public class Fatoracao {

	public static void main (String [] args){
		
		Scanner scanner = new Scanner(System.in);
		System.out.println("Digite o número que gostaria de fatorar: ");
		int numero = scanner.nextInt();
		System.out.println("Digite o grau da raiz: ");
		int grau = scanner.nextInt();
		int divisores [] = achaDivisores(numero);//todos os divisores do número
		int numDiferentes = 1;//numero de divisores diferentes
		int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
		int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
		
		diferentes = achaDivisoresDiferentes(divisores);
		grausDiferentes = achaGrausDiferentes(divisores);
		numDiferentes = diferentes.length;
		
		
		for (int i = 0; i < divisores.length; i++) {
			System.out.println("Um dos divisores é: "+divisores[i]);
		}
		for (int i = 0; i < numDiferentes; i++) {
			System.out.println("Existe: " +grausDiferentes[i] + " números " + diferentes[i]);
		}
		
		int [] divisiveis = divideGraus(numDiferentes, grau, grausDiferentes);
		int num1=1;
		int num2=1;
		
		for (int i = 0; i < numDiferentes; i++){
			if(divisiveis[i]==1){
				num1=(int) (num1*Math.pow(diferentes[i], grausDiferentes[i]/grau));
			}
			else if (divisiveis[i]==0)
				num2=(int) (num2*Math.pow(diferentes[i], grausDiferentes[i]));
		}
		
		
		System.out.println("\n\nO resultado final é: "+ num1 +" raiz " +num2);
		
	}
	
	public static int[] divideGraus(int numDiferentes, int grau, int [] grausDiferentes){//acha os números que são divisiveis pelo grau fatorada
		int [] divisiveis = new int [numDiferentes];
		for (int i = 0; i < numDiferentes; i++) {
			if (grausDiferentes[i]%grau==0)
				divisiveis[i] = 1;
		}
		return divisiveis;
		
	}
	
	public static int [] achaGrausDiferentes(int [] divisores){//acha o grau de cada divisor
		int numDiferentes = 1;//numero de divisores diferentes
		int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
		int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
		
		for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
			int corrente = diferentes[k] = divisores[i];
			grausDiferentes[k] = 1;
			for (int j = i+1; j < diferentes.length; j++) {
				if (corrente == divisores[j]){
					grausDiferentes[k]++;
				}
				else{
					i = j-1;
					j=diferentes.length;
					numDiferentes++;
				}
					
			}
			
			
		}
		int [] auxGrausDiferentes = new int [numDiferentes];
		for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
			auxGrausDiferentes[i] = grausDiferentes[i];
		}
		
		return auxGrausDiferentes;
		
		
		
	}
	
	public static int [] achaDivisoresDiferentes(int [] divisores){//encontra número de divisores diferentes e guarda num array
		int numDiferentes = 1;//numero de divisores diferentes
		int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
		int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
		
		for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
			int corrente = diferentes[k] = divisores[i];
			grausDiferentes[k] = 1;
			for (int j = i+1; j < diferentes.length; j++) {
				if (corrente == divisores[j]){
					grausDiferentes[k]++;
				}
				else{
					i = j-1;
					j=diferentes.length;
					numDiferentes++;
				}
					
			}
			
			
		}
		int [] auxDiferentes = new int [numDiferentes];
		for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
			auxDiferentes[i] = diferentes[i];
		}
		
		return auxDiferentes;
		
	}
	
	public static int [] achaDivisores (int numero){//acha todos os divisores
		int divisores [] = new int [1024];//array contento todos os divisores
		int divisor = 2;
		int aux = numero;
		int numDivisores = 0;
		
		while (aux > 1){//verifica até a variavel chegar em 1, não podendo mais ser fatorada
			int resto = aux%divisor;
			if (resto == 0){//verifica se o resto é igual a 0, se for é divisivel
				divisores[numDivisores++]=divisor;
				aux/=divisor;
			}
			else{//se o resto não for igual a 0 incrementa o divisor
				divisor++;
			}
				
			
		}
		int auxDivisores [] = new int [numDivisores];//array contento todos os divisores com tamanho adequado
		for (int i = 0; i < auxDivisores.length; i++) {//copia apenas os divisores para o array 
			auxDivisores[i] = divisores[i];
		}
		return auxDivisores;
	}
	
	
}
Luiz_Augusto_Prado
ibaierle:
Olá amigo, fiz um método bem básico. Ele realiza a fatoração, porém não realiza a fatoração de números sem que a divisão de um pelo outro não seja exata. Ex.: "²√2³", ele poderia fatorar para "2 ²√2", mas ele só irá fatorar números com divisões corretas. Ex.: "²√2²", ou elevado na quatro, ou seis ou oito. Fiz no programa para que você possa alterar o grau da raiz podendo ser qualquer um, e não somente quadrada(²). Para realizar a outra fatoração Ex.: "²√2³", vai dar um pouco mais de trabalho, porém não é difícil, você apenas precisa seguir a lógica que criei. Teste o programa, pois testei algumas entradas e as mesmas funcionaram. Segue o código.
import java.util.*;


public class Fatoracao {

	public static void main (String [] args){
		
		Scanner scanner = new Scanner(System.in);
		System.out.println("Digite o número que gostaria de fatorar: ");
		int numero = scanner.nextInt();
		System.out.println("Digite o grau da raiz: ");
		int grau = scanner.nextInt();
		int divisores [] = achaDivisores(numero);//todos os divisores do número
		int numDiferentes = 1;//numero de divisores diferentes
		int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
		int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
		
		diferentes = achaDivisoresDiferentes(divisores);
		grausDiferentes = achaGrausDiferentes(divisores);
		numDiferentes = diferentes.length;
		
		
		for (int i = 0; i < divisores.length; i++) {
			System.out.println("Um dos divisores é: "+divisores[i]);
		}
		for (int i = 0; i < numDiferentes; i++) {
			System.out.println("Existe: " +grausDiferentes[i] + " números " + diferentes[i]);
		}
		
		int [] divisiveis = divideGraus(numDiferentes, grau, grausDiferentes);
		int num1=1;
		int num2=1;
		
		for (int i = 0; i < numDiferentes; i++){
			if(divisiveis[i]==1){
				num1=(int) (num1*Math.pow(diferentes[i], grausDiferentes[i]/grau));
			}
			else if (divisiveis[i]==0)
				num2=(int) (num2*Math.pow(diferentes[i], grausDiferentes[i]));
		}
		
		
		System.out.println("\n\nO resultado final é: "+ num1 +" raiz " +num2);
		
	}
	
	public static int[] divideGraus(int numDiferentes, int grau, int [] grausDiferentes){//acha os números que são divisiveis pelo grau fatorada
		int [] divisiveis = new int [numDiferentes];
		for (int i = 0; i < numDiferentes; i++) {
			if (grausDiferentes[i]%grau==0)
				divisiveis[i] = 1;
		}
		return divisiveis;
		
	}
	
	public static int [] achaGrausDiferentes(int [] divisores){//acha o grau de cada divisor
		int numDiferentes = 1;//numero de divisores diferentes
		int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
		int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
		
		for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
			int corrente = diferentes[k] = divisores[i];
			grausDiferentes[k] = 1;
			for (int j = i+1; j < diferentes.length; j++) {
				if (corrente == divisores[j]){
					grausDiferentes[k]++;
				}
				else{
					i = j-1;
					j=diferentes.length;
					numDiferentes++;
				}
					
			}
			
			
		}
		int [] auxGrausDiferentes = new int [numDiferentes];
		for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
			auxGrausDiferentes[i] = grausDiferentes[i];
		}
		
		return auxGrausDiferentes;
		
		
		
	}
	
	public static int [] achaDivisoresDiferentes(int [] divisores){//encontra número de divisores diferentes e guarda num array
		int numDiferentes = 1;//numero de divisores diferentes
		int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
		int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
		
		for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
			int corrente = diferentes[k] = divisores[i];
			grausDiferentes[k] = 1;
			for (int j = i+1; j < diferentes.length; j++) {
				if (corrente == divisores[j]){
					grausDiferentes[k]++;
				}
				else{
					i = j-1;
					j=diferentes.length;
					numDiferentes++;
				}
					
			}
			
			
		}
		int [] auxDiferentes = new int [numDiferentes];
		for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
			auxDiferentes[i] = diferentes[i];
		}
		
		return auxDiferentes;
		
	}
	
	public static int [] achaDivisores (int numero){//acha todos os divisores
		int divisores [] = new int [1024];//array contento todos os divisores
		int divisor = 2;
		int aux = numero;
		int numDivisores = 0;
		
		while (aux > 1){//verifica até a variavel chegar em 1, não podendo mais ser fatorada
			int resto = aux%divisor;
			if (resto == 0){//verifica se o resto é igual a 0, se for é divisivel
				divisores[numDivisores++]=divisor;
				aux/=divisor;
			}
			else{//se o resto não for igual a 0 incrementa o divisor
				divisor++;
			}
				
			
		}
		int auxDivisores [] = new int [numDivisores];//array contento todos os divisores com tamanho adequado
		for (int i = 0; i < auxDivisores.length; i++) {//copia apenas os divisores para o array 
			auxDivisores[i] = divisores[i];
		}
		return auxDivisores;
	}
	
	
}

Por que vc perguntou qul o grau da raiz?

System.out.println("Digite o grau da raiz: ");
I

A raiz será apenas quadrada (²√.)? Se for, você pode tirar fora a pergunta e colocar na variável grau o número 2, caso contrário deixe assim, pois podemos ter raízes de diferentes tipos. Ex.: quadrada (²√.), cúbica (³√.), …etc

Luiz_Augusto_Prado

verdade. esqueci. vc quer o numero fatorado e depois a raiz desse resultado.

vc conhece uma forma de fazer utilizando um array de numeros primos?

O usuário entanglement faz um comentario interessante as 21/12/2011 06:20:03:

como ele sugeriu, e eu pude comprovar, ter uma tabela de números primos acelera o processo da fatoração. vc só fica limitado a fatorar números que tenham sua raiz menores ou iguais ao maior primo armazenado.

I

Realmente, pois tendo uma tabela não necessitaria descobrir cada um dos fatores, pois já teríamos eles. E de qualquer forma todos os números depois de fatorados tornarão-se fatores de primos. Ex.: testamos na fatoração se o número é divisível por 2, se não for, pulamos para o próximo que é o 3 e assim sucessivamente, porém poderemos desconsiderar os próximos números como 4, 6, 8, 9…etc, pois são todos divisíveis por 2 ou 3, e caso o número não seja divisível por eles, também não será dos seus divisores.

Dê uma pesquisada sobre os Números de Gödel e Fatores Primos.

Bem, para armazenar os primos, você poderia utilizar uma lista pré-escrita contendo uma grande quantidade de números primos (porém não é aconselhável, tendo em vista que o número que você irá fatorar poderá ser maior que sua lista), ou gerar esta lista na hora da execução, antes de fatorá-los, contendo todos os números primos de 2 até o número a ser fatorado.

regis_hideki

AlanGomes:
Estou criando um aplicativo andorid e estou com um problema:
Se eu tenho √80 eu preciso que ela seja fatorada para 4√5 utilizando MMC, alguém pode me ajudar?
EX:
80|2 \ 2²
40|2 /
20|2 \ 2²
10|2 /
5|5 > 5
1|

&#8730;2².2².5
2.2&#8730;5
4&#8730;5</blockquote>

Com o operador % você consegue descobrir se um número é divisível por outro. Dessa forma, só armazenar quantas vezes cada fator é divisível (no seu exemplo, 2 é divisível 4 vezes - o expoente - e o 5 apena uma). Você pode armazenar essas informações em um Map, por exemplo. Chamarei a base de b e o expoente de e, para facilitar. Seu Map terá uma chave 2 com valor 4 e uma chave 5 com valor 1;

Tendo isso em mãos, só seguir a lógica:
Para cada chave do Map:
se o valor for par, então o fator é b^(n/2). O expoente é dividido por 2 para cortar com a raiz.
se o valor for ímpar, então o fator é raiz(b) * b^((n-1)/2) - o (n-1) é pra eliminar o que ficará na raiz, tornando o expoente par e, portanto, divisível por 2.

No final, só multiplicar todos os fatores.

A
ibaierle:
Olá amigo, fiz um método bem básico. Ele realiza a fatoração, porém não realiza a fatoração de números sem que a divisão de um pelo outro não seja exata. Ex.: "²√2³", ele poderia fatorar para "2 ²√2", mas ele só irá fatorar números com divisões corretas. Ex.: "²√2²", ou elevado na quatro, ou seis ou oito. Fiz no programa para que você possa alterar o grau da raiz podendo ser qualquer um, e não somente quadrada(²). Para realizar a outra fatoração Ex.: "²√2³", vai dar um pouco mais de trabalho, porém não é difícil, você apenas precisa seguir a lógica que criei. Teste o programa, pois testei algumas entradas e as mesmas funcionaram. Segue o código.
import java.util.*;


public class Fatoracao {

	public static void main (String [] args){
		
		Scanner scanner = new Scanner(System.in);
		System.out.println("Digite o número que gostaria de fatorar: ");
		int numero = scanner.nextInt();
		System.out.println("Digite o grau da raiz: ");
		int grau = scanner.nextInt();
		int divisores [] = achaDivisores(numero);//todos os divisores do número
		int numDiferentes = 1;//numero de divisores diferentes
		int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
		int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
		
		diferentes = achaDivisoresDiferentes(divisores);
		grausDiferentes = achaGrausDiferentes(divisores);
		numDiferentes = diferentes.length;
		
		
		for (int i = 0; i < divisores.length; i++) {
			System.out.println("Um dos divisores é: "+divisores[i]);
		}
		for (int i = 0; i < numDiferentes; i++) {
			System.out.println("Existe: " +grausDiferentes[i] + " números " + diferentes[i]);
		}
		
		int [] divisiveis = divideGraus(numDiferentes, grau, grausDiferentes);
		int num1=1;
		int num2=1;
		
		for (int i = 0; i < numDiferentes; i++){
			if(divisiveis[i]==1){
				num1=(int) (num1*Math.pow(diferentes[i], grausDiferentes[i]/grau));
			}
			else if (divisiveis[i]==0)
				num2=(int) (num2*Math.pow(diferentes[i], grausDiferentes[i]));
		}
		
		
		System.out.println("\n\nO resultado final é: "+ num1 +" raiz " +num2);
		
	}
	
	public static int[] divideGraus(int numDiferentes, int grau, int [] grausDiferentes){//acha os números que são divisiveis pelo grau fatorada
		int [] divisiveis = new int [numDiferentes];
		for (int i = 0; i < numDiferentes; i++) {
			if (grausDiferentes[i]%grau==0)
				divisiveis[i] = 1;
		}
		return divisiveis;
		
	}
	
	public static int [] achaGrausDiferentes(int [] divisores){//acha o grau de cada divisor
		int numDiferentes = 1;//numero de divisores diferentes
		int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
		int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
		
		for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
			int corrente = diferentes[k] = divisores[i];
			grausDiferentes[k] = 1;
			for (int j = i+1; j < diferentes.length; j++) {
				if (corrente == divisores[j]){
					grausDiferentes[k]++;
				}
				else{
					i = j-1;
					j=diferentes.length;
					numDiferentes++;
				}
					
			}
			
			
		}
		int [] auxGrausDiferentes = new int [numDiferentes];
		for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
			auxGrausDiferentes[i] = grausDiferentes[i];
		}
		
		return auxGrausDiferentes;
		
		
		
	}
	
	public static int [] achaDivisoresDiferentes(int [] divisores){//encontra número de divisores diferentes e guarda num array
		int numDiferentes = 1;//numero de divisores diferentes
		int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
		int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
		
		for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
			int corrente = diferentes[k] = divisores[i];
			grausDiferentes[k] = 1;
			for (int j = i+1; j < diferentes.length; j++) {
				if (corrente == divisores[j]){
					grausDiferentes[k]++;
				}
				else{
					i = j-1;
					j=diferentes.length;
					numDiferentes++;
				}
					
			}
			
			
		}
		int [] auxDiferentes = new int [numDiferentes];
		for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
			auxDiferentes[i] = diferentes[i];
		}
		
		return auxDiferentes;
		
	}
	
	public static int [] achaDivisores (int numero){//acha todos os divisores
		int divisores [] = new int [1024];//array contento todos os divisores
		int divisor = 2;
		int aux = numero;
		int numDivisores = 0;
		
		while (aux > 1){//verifica até a variavel chegar em 1, não podendo mais ser fatorada
			int resto = aux%divisor;
			if (resto == 0){//verifica se o resto é igual a 0, se for é divisivel
				divisores[numDivisores++]=divisor;
				aux/=divisor;
			}
			else{//se o resto não for igual a 0 incrementa o divisor
				divisor++;
			}
				
			
		}
		int auxDivisores [] = new int [numDivisores];//array contento todos os divisores com tamanho adequado
		for (int i = 0; i < auxDivisores.length; i++) {//copia apenas os divisores para o array 
			auxDivisores[i] = divisores[i];
		}
		return auxDivisores;
	}
	
	
}
pow, muito obrigado, funcionou perfeitamente!
Criado 18 de setembro de 2014
Ultima resposta 23 de set. de 2014
Respostas 7
Participantes 4