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! 🧐