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

Fatorial de 30 está retornando número negativo

class Fatorial{
    public static void main(String[] args){
        long numero = 1L;
        for (long i = 1; i<=30; i++) {
        numero  *= i;
        }
    System.out.println("O fatorial  é igual a " + numero );
    }
}
4 respostas
solução!

Oi Aline, tudo bem ?

Rodei aqui o seu projetinho e cheguei também no mesmo resultado.

Deve haver algum problema na memória/ versão do java que pode estar causando isso, vou averiguar com mais calma

Olá Aline,

Provavelmente isso ocorreu pois a variável numero estourou (neste link constam os valores máximos e mínimos do tipo long).

Deste modo, resolvi o problema usando uma outra classe do Java: BigInteger. Abaixo, o código:

import java.math.BigInteger;

class Fatorial {
    public static void main(String[] args){
        // mais sobre BigInteger: https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
        BigInteger numero = new BigInteger("1", 10); // 
        for (int i = 1; i<=30; i++) {
            numero = numero.multiply( BigInteger.valueOf( i ) );
        }
        System.out.println("O fatorial  é igual a " + numero );
    }
}

Espero ter ajudado. Qualquer dúvida, diga aí.

Abraço.

Uma pequena alteração no seu código já resolve seu problema!

Basta substituir o long por um double. Os dois tipos primitivos têm 64 bits de tamanhos, porém, o long só trabalha com números inteiros, enquanto o doublecom ponto flutuante.

class Fatorial{
    public static void main(String[] args){
       long numero = 1L;
        for (long i = 1; i<=30; i++) {
        numero  *= i;
        }
    System.out.println("O fatorial  é igual a " + numero );
    }
}

Aparentemente a diferença não deveria ser tão grande, visto que os dois tem o mesmo tamanho. A questão está no fato de operações de multiplicação e divisão usam ponto flutuante para serem processadas. Por isso que em determinados casos, o long não é suficiente para calcular.

Espero ter ajudado.

Isso acontece porque, a partir de 13!, o valor supera o limite superior do tipo int. O tipo long consegue armazenar o cálculo dos fatoriais até 20!