2016-04-14 1 views
2

Vu mon code:factoriel boucle For ne fonctionne que jusqu'à 12

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.IOException; 

public class Fact_2 { 
    public static void main(String args[]) throws IOException { 
    System.out.println("Please enter a number:"); 
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
    int fact = Integer.parseInt(input.readLine()); 

    int factorial = 1; 
    for (int i = 1; i <= fact; i++) { 
     factorial = factorial * i; 
    } 
    System.out.println("The factorial of " + fact + " is " + factorial); 
} 
} 

Le programme fonctionne correctement ... que jusqu'au 12 chiffres. J'ai vérifié pour m'assurer que toutes les factorielles étaient correctes mais quand vous entrez 13 pour votre numéro vous obtenez 1932053504 quand il devrait être 6227020800. Pourquoi est-ce?

+5

Lire sur le dépassement d'entier. Puis retournez et changez 'int factorial = 1;' 'long factorial = 1;' –

+0

@DavidWallace merci! – feelingstoned

Répondre

4

Je veux juste ajouter le raisonnement mathématique en ce qui concerne le débordement d'entier:

12! = 479,001,600 
13! = 6,227,020,800 

Maintenant, la limite de la plage pour int (32 bits) type est:

-2,147,483,648 to 2,147,483,647 

qui est exc eeded juste au moment où le factoriel devient 13 depuis:

479,001,600 < 2,147,483,647 < 6,227,020,800 

En raison du trop-plein, quand vous avez 13 factoriel, il la traite comme:

13! = 6,227,020,800 % 4,294,967,296 
    = 1,932,053,504 + 4,294,967,296 x 1 % 4,294,967,296 
    = 1,932,053,504 

Pour résoudre ce problème, utilisez BigInteger. Si vous ne avez pas besoin d'être trop grand, utilisez long qui a une capacité de:

–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 

long peut gérer jusqu'à 20!

20! = 2,432,902,008,176,640,000 

Au-delà, vous devez utiliser BigInteger

0

vous avez un trop-plein ... utilisez BigInteger classe

BigInteger factorial = BigInteger.valueOf(1); 
      int fact = 13; 
      for (int i = 1; i <= fact; i++) { 
       factorial = factorial.multiply(BigInteger.valueOf(i)); 
      } 
      System.out.println(factorial);