Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Como calcular fatorial de numeros grandes no Java

Boa noite,

import java.util.Scanner;

public class Desafio6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Digite o número para o qual você quer saber o fatorial: ");
        int numero = scanner.nextInt();
        int fatorial = 1;

        for (int i = 1; i <= numero ; i++) {
            fatorial *= i;
        }

        System.out.println("O fatorial de " + numero + " é " + fatorial + ".");

    }
}

eu percebi no desafio 6 que ao calcular o fatorial de 20 ele resulta em um numero negativo, mas quando eu calculo o fatorial de 30 ele resulta em um numeo positivo. Porque isto ocorre?

3 respostas

Oi Klaus,

Essa é uma excelente observação sobre o comportamento do cálculo fatorial em Java! 👍

O que você está vendo é um problema de overflow de inteiros.

Em Java, o tipo int tem um limite máximo e mínimo para os valores que pode armazenar.

Quando o resultado de uma operação excede esse limite, ocorre o overflow, e o valor "dá a volta", resultando em um número inesperado, que pode ser negativo ou positivo.

O fatorial de 20 já é um número grande o suficiente para ultrapassar o limite máximo de um int, resultando em um valor negativo.

Já o fatorial de 30, por sua vez, também ultrapassa o limite, mas o "giro" no ciclo dos números inteiros faz com que o resultado seja um número positivo, embora incorreto. 🤔

Para lidar com fatoriais de números maiores, você pode usar o tipo long, que tem um limite maior, ou a classe BigInteger, que pode representar números de qualquer tamanho.

Veja um exemplo usando long:

public class Desafio6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Digite o número para o qual você quer saber o fatorial: ");
        int numero = scanner.nextInt();
        long fatorial = 1;

        for (int i = 1; i <= numero ; i++) {
            fatorial *= i;
        }

        System.out.println("O fatorial de " + numero + " é " + fatorial + ".");
    }
}

Com long, você conseguirá calcular fatoriais maiores sem overflow. 💪

Para saber mais: Documentação da classe BigInteger. A documentação oficial da classe BigInteger da Java, que permite trabalhar com números inteiros de precisão arbitrária.

Continue explorando e experimentando, a prática leva à perfeição! 🧐

Boa tarde, observei que ainda com long, aconteceu alguns overflow. Então fiz a implementação utilizado a classe BigInteger. segue o código abaixo:

import java.math.BigInteger;
import java.util.Scanner;

//Utilizando a classe BiInteger

public class Desafio6 {
    public static BigInteger calcularFatorial(int numero){
        BigInteger fatorial = BigInteger.ONE;

        for (int i = 1; i < numero; i++) {
            fatorial = fatorial.multiply(BigInteger.valueOf(i));
        }

        return fatorial;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Digite o número para o qual você quer saber o fatorial: ");
        int numero = scanner.nextInt();

        if (numero < 0 ){
            System.out.println("Não é possível calcular o Fatorial de um número negativo.");
        } else {
            BigInteger resultado = calcularFatorial(numero);
            System.out.println("O fatorial de " + numero + " é " + resultado + ".");
        }
    }
}

Segue o reultado da compilação: Resultado da compilação do código para calcular fatorial utilizando a classe BigIntegerGrato amigo, pela ajuda!

solução!

muito bem