Estou utilzando esse método para calcular fatorial:
public long fatorial(int n) {
if(n==0||n==1) {
return 1;
}
else {
return n*fatorial(n-1);
}
}
Ok, ele funciona perfeitamente para entradas de números pequenos. Mas conforme as entradas vão aumentando de valor o método começa a retornar números long negativos(que acho que é porque estourou o long) e após certp número ele começa a retornar 0.
Alguém sabe me explicar por qual motivo isso acontece e se existe alguma forma de consertar meu algoritmo de forma que ele consiga realizar o fatorial de números maiores?
Estou utilzando esse método para calcular fatorial:
public long fatorial(int n) {
if(n==0||n==1) {
return 1;
}
else {
return n*fatorial(n-1);
}
}
Ok, ele funciona perfeitamente para entradas de números pequenos. Mas conforme as entradas vão aumentando de valor o método começa a retornar números long negativos(que acho que é porque estourou o long) e após certp número ele começa a retornar 0.
Alguém sabe me explicar por qual motivo isso acontece e se existe alguma forma de consertar meu algoritmo de forma que ele consiga realizar o fatorial de números maiores?
Muito obrigado pela ajuda![/quote]
O maior int é 2 elevado a 31 menos 1 (2147483647) , e o maior long é 2 elevado a 63 menos 1 (9223372036854775807). Como você deve ter percebido, esses números são menores que 70!, que é (segundo a calculadora do Windows) 1,1978571669969891796072783721689 vezes 10 elevado a 100.
Se você fizer as contas com double, vai conseguir calcular fatoriais até 170! (7,2574156153079989673967282111293e+306 segundo a calculadora do Windows, 7.257415615307994E306 usando o Java e double)
Se quiser fatoriais de números maiores, use java.math.BigInteger. Por exemplo, usando BigInteger, 170! vai dar
7257415615307998967396728211129263114716991681296451376543577798900561843401706157852350749242617459511490991237838520776666022565442753025328900773207510902400430280058295603966612599658257104398558294257568966313439612262571094946806711205568880457193340212661452800000000000000000000000000000000000000000
Thingol, eu tentei fazer o método com BigInteger mas não consegui… Pesquisei em alguns exemplos de como se manipula essa classe, mas não consegui adaptá-la ao meu problema.
Desculpa ser esse tipo chato de pidão, mas como você faria o método fatorial usando BigInteger?