[RESOLVIDO] Fatoriais de 1 a 40

Pessoal preciso de ajuda para descobrir o motivo do erro em um dos exercícios da apostila caelum fj 11 pag 26. Nesse exercício devo imprimir os fatoriais de 1 a 40. Fiz da seguinte forma:

public class ImprimeFatoriasDe1a40 { public static void main(String[] args) { for (long n = 1, fatorial = 1; n <= 40; n++) { fatorial = fatorial * n; System.out.println("O fatorial de " + n + "! é igual a " + fatorial); } } }
Depois do fatorial 20 o código mostra resultados errados, por exemplo, o fatorial de 40! = -70609262346240000. Qual foi o erro?

[quote=Onimatsu]Pessoal preciso de ajuda para descobrir o motivo do erro em um dos exercícios da apostila caelum fj 11 pag 26. Nesse exercício devo imprimir os fatoriais de 1 a 40. Fiz da seguinte forma:

public class ImprimeFatoriasDe1a40 { public static void main(String[] args) { for (long n = 1, fatorial = 1; n <= 40; n++) { fatorial = fatorial * n; System.out.println("O fatorial de " + n + "! é igual a " + fatorial); } } }
Depois do fatorial 20 o código mostra resultados errados, por exemplo, o fatorial de 40! = -70609262346240000. Qual foi o erro?
[/quote]

oi,

isso acontece porque estoura a capacidade do integer que é de

ou seja

Então o que eu posso usar no lugar do long, existe uma função para tratar desse caso?

oi,

utilize o BigInteger

BigInteger n = BigInteger.ONE; for (int i = 1; i <= 20; i++) { n = n.multiply(BigInteger.valueOf(i)); System.out.println(i + "! = " + n); }

[quote]oi,

utilize o BigInteger

BigInteger n = BigInteger.ONE; for (int i = 1; i <= 20; i++) { n = n.multiply(BigInteger.valueOf(i)); System.out.println(i + "! = " + n); } [/quote]

O fatorial de 40! é igual a 815915283247897734345611269596115894272000000000

BigInteger fatorial = BigInteger.ONE; for (long n = 1; n <= 40; n++) { fatorial = fatorial.multiply(BigInteger.valueOf(n)); System.out.println("O fatorial de " + n + "! é igual a " + fatorial); }
Agora sim ficou certo. Valeu mesmo pela ajuda tava precisando.
Abs!

[quote=Onimatsu][quote]oi,

utilize o BigInteger

BigInteger n = BigInteger.ONE; for (int i = 1; i <= 20; i++) { n = n.multiply(BigInteger.valueOf(i)); System.out.println(i + "! = " + n); } [/quote]

O fatorial de 40! é igual a 815915283247897734345611269596115894272000000000

BigInteger fatorial = BigInteger.ONE; for (long n = 1; n <= 40; n++) { fatorial = fatorial.multiply(BigInteger.valueOf(n)); System.out.println("O fatorial de " + n + "! é igual a " + fatorial); }
Agora sim ficou certo. Valeu mesmo pela ajuda tava precisando.
Abs![/quote]

Peguei esse bonde “dúvida” aí e agradeço, pois também me ajudou muito!

BigInteger é o cara, rsrs!