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|
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.
[code]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;
}
[quote=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.
[code]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;
}
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
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.
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.
[quote=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|
√2².2².5
2.2√5
4√5[/quote]
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.
[quote=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.
[code]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;
}
}
[/code][/quote]
pow, muito obrigado, funcionou perfeitamente!