Problema com exercício

4 respostas
L

Depois de muito batalhar consegui resolver outro dos exercicios do livro do Deitel que pedia para escrever um programa que calculase o fatorial dos inteiros de 1 à 5 e exibir os resultados numa JTextArea. Tudo ocorre bem, porém, quando altero o código para que ele calcule o fatorial dos inteiros de 1 à 17 (ou mais) começa aparecer resultados negativos. Alguém sabe me explicar o porque de aparecerem esses valores negativos se em nenhum momento o programa usa calculos de subtração ou divisão?

/*
 * Exer5_8.java
 *
 * Criado em 7 de Julho de 2005, 21:17
 *
 * Programa escrito para calcular o fatorial dos inteiros de 1 à 5 e exibilos em uma JTextArea
 * 
 * 
 */

/**
 *
 * Autor Matheus
 */
import javax.swing.JTextArea;   // Importa a classe JTextArea do pacote javax.swing.
import javax.swing.JOptionPane; // Importa a classe JOptionPane do pacote javax.swing.

public class Exer5_8 {
    
    public static void main( String args[] )
    {
        int sentinel = 1, result = 1, valor = 1;
        
        JTextArea Janelatexto = new JTextArea();
        
        for( int inteiro2 = 1; inteiro2 <= 19; inteiro2++ ) {
            
            while( sentinel <= inteiro2 ) {
                result *= valor++;
                sentinel++;
            }
            
            Janelatexto.append( inteiro2 + "\t" + result  + "\n");
            
            result = 1;
            sentinel = 1;
            valor = 1;
        
        }
        
        JOptionPane.showMessageDialog( null,
                Janelatexto, "Tabela", JOptionPane.INFORMATION_MESSAGE );
    
    }
    
}

4 Respostas

G

Altere de int para long.

O tipo int tem limite, dai deve ter estourado.

abraços

R

por coincidencia eu tb estou no mesmo exercício, eu li o programa e não entendi a lógica ainda. alguem poderia explicar passo a passo como funciona essa aplicação?

F

Calcular o fatorial de numeros maiores de 17 vai gerar numeros MUITO grande, talvez nem uma variavel do tipo long de conta, aconselho usar a classe BigInteger, do pacote java.math:

http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigInteger.html

E respondendo ao Rojas, no for externo vai percorrer os numeros cujo fatorial será calculado, então o while serve para calcular o fatorial do numero inteiro2, e depois o resultado é adicionado no JTextArea e logo em seguida as variaveis são preparadas pro próximo numero.

S

Licker, um int tem, em Java, 4 bytes.

O resultado deu negativo pelo seguinte:

Digamos que o int tenha só 1 byte (8 bits).
O primeiro bit é para o sinal (1 = negativo e 0 = positivo). Logo, 00111011 é positivo, e 10000100 é negativo.

Se você tem 01111111 (o maior número positivo) e acrescenta 1, vai ficar: 10000000, que é negativo!

Faça o teste:

int x = Integer.MAX_VALUE; System.out.println(x); x = x + 1; System.out.println(x);

Vai imprimir [telefone removido] e depois -[telefone removido].
Ou seja, o int estourou, sim. Se usar long, vai demorar mais, mas vai acontecer o mesmo.
Daí só usando uma classe tipo BigInteger ou BigDecimal, mas acho que você queria mais esclarecer uma dúvida do que procurando uma solução :wink:

Criado 10 de julho de 2005
Ultima resposta 10 de jul. de 2005
Respostas 4
Participantes 5