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 );
}
}
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 );
}
}
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 double
com 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!