Ir ao conteúdo

Java JAVA: Problema com programa que calcula números fatoriais


Ir à solução Resolvido por A.Victor,

Posts recomendados

Postado

Boa noite, comecei aprender java a pouco tempo e estava criando um programa que calcula números fatoriais até o 40!, fiz alguns testes e só funcionou até o 13!, depois ele começa a entregar números errados, creio eu que seja um erro meu de lógica ou está relacionado ao tamanho dos tipos de variáveis que estou utilizando.

até o 10! :

import java.util.*;
import java.lang.*;
import java.io.*;

public class Fatorial
{
	public static void main (String[] args) throws java.lang.Exception
	{
	    int i;//variavel i auxiliar
	    int j;//variavel j auxiliar
        int[] aux = new int[10];//vetor para range e resultados
        //Range
        for(i=0;i<10;i++){
            aux[i] = i+1;
        }
        //Fatorial
        for(i=0;i<10;i++){
            for(j=aux[i];j>1;j--){
                aux[i] = (aux[i]*(j-1));    
            }
        }
        //Resultados
        for(i=1;i<11;i++){
            System.out.println(i+"! = "+aux[i-1]);
        }
	}//FIM MAIN
	
}//FIM CLASSE
//SAIDA
// 1! = 1
// 2! = 2
// 3! = 6
// 4! = 24
// 5! = 120
// 6! = 720
// 7! = 5040
// 8! = 40320
// 9! = 362880
// 10! = 3628800

Até o 20! já não funciona corretamente:

import java.util.*;
import java.lang.*;
import java.io.*;

public class Fatorial
{
	public static void main (String[] args) throws java.lang.Exception
	{
	    int i;//variavel i auxiliar
	    int j;//variavel j auxiliar
        int[] aux = new int[20];//vetor para range e resultados
        //Range
        for(i=0;i<20;i++){
            aux[i] = i+1;
        }
        //Fatorial
        for(i=0;i<20;i++){
            for(j=aux[i];j>1;j--){
                aux[i] = (aux[i]*(j-1));    
            }
        }
        //Resultados
        for(i=1;i<21;i++){
            System.out.println(i+"! = "+aux[i-1]);
        }
	}//FIM MAIN
	
}//FIM CLASSE
//SAIDA
// 1! = 1
// 2! = 2
// 3! = 6
// 4! = 24
// 5! = 120
// 6! = 720
// 7! = 5040
// 8! = 40320
// 9! = 362880
// 10! = 3628800
// 11! = 39916800
// 12! = 479001600
// 13! = 1932053504
// 14! = 1278945280
// 15! = 2004310016
// 16! = 2004189184
// 17! = -288522240
// 18! = -898433024
// 19! = 109641728
// 20! = -2102132736

Coloquei só até o 20 para não ficar grande aqui, mas isso ocorre com qualquer valor acima de 13!,  o que posso fazer para solucionar isso?

Postado

@AdrianoSiqueira Eu até tinha pensado em trocar por long, mas acabava dando erro porque eu estava trocando também da variável i, consertei e consegui aumentar o limite com o long, porém ainda estou limitado a 20!, meu objetivo é entregar o resultado de até 40! que seria este valor = 815915283247897734345611269596115894272000000000, o que posso fazer para contornar isso?

Código Atual:

import java.util.*;
import java.lang.*;
import java.io.*;

public class Fatorial
{
	public static void main (String[] args) throws java.lang.Exception
	{
	    int i;//variavel i auxiliar
	    long j;//variavel j auxiliar
        long[] aux = new long[40];//vetor para range e resultados
        //Range
        for(i=0;i<40;i++){
            aux[i] = i+1;
        }
        //Fatorial
        for(i=0;i<40;i++){
            for(j=aux[i];j>1;j--){
                aux[i] = (aux[i]*(j-1));    
            }
        }
        //Resultados
        for(i=1;i<41;i++){
            System.out.println(i+"! = "+aux[i-1]);
        }
	}//FIM MAIN
	
}//FIM CLASSE
//SAIDA
//...
// 19! = 121645100408832000
// 20! = 2432902008176640000
// 21! = -4249290049419214848
// 22! = -1250660718674968576
// 23! = 8128291617894825984
// 24! = -7835185981329244160
// 25! = 7034535277573963776
// 26! = -1569523520172457984
// 27! = -5483646897237262336
// 28! = -5968160532966932480
// 29! = -7055958792655077376
// ...

 

  • 4 semanas depois...
  • Solução
Postado

Bom já faz bastante tempo que consegui resolver o problema e esqueci de atualizar aqui, contudo gostaria de contribuir para o pessoal que ta começando a estudar também e deixarei o código da solução aqui:

Spoiler

import java.math.BigInteger;

public class Fatorial
{
	public static void main (String[] args)
	{
	    int i;//variavel i auxiliar
	    int j;//variavel j auxiliar
        BigInteger[] aux = new BigInteger[40];//vetor para range e resultados
      
        //Range
        for(i=0;i<40;i++){
            aux[i] = BigInteger.valueOf(i+1);
        }
      
        //Fatorial
        for(i=0;i<40;i++){
            for(j=aux[i].intValue();j>1;j--){
                aux[i] = aux[i].multiply(BigInteger.valueOf(j-1));
            }
        }
      
        //Resultados
        for(i=0;i<40;i++){
            System.out.println((i+1)+"! = "+aux[i]);
        }
      
	}//FIM MAIN
}//FIM CLASSE FATORIAL

 

Basicamente utilizei a classe BigInteger para solucionar o problema e tive que utilizar algumas funções para converter os tipos de variáveis em certas situações como é possível ver no código acima.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...