Question 5


Mon calcul de factorielles donne des résultats faux...

Je voudrais tout simplement vous poser une question concernant le programme en java qui permet de calculer la factorielle d'un nombre entier. J'ai remarqué lors de son exécution que si ce nombre entier dépasse 20 ça donne des resultats faux. Voilà le programme que j'ai utilisé:
class factoriel { 
 int i;
 
 factoriel (int i) {
  this.i=i;
 }
 
 long fact(int i) {
  if (i==0)
  return 1;
  else
  return (i*fact(i-1));
 }
 
 public static void main (String[] arg) {
  factoriel fay=new factoriel(5);
  System.out.println(fay.fact(5));
 }
}

Il suffit de changer 5 par n'importe quel entier pour calculer la factorielle de ce nombre.

Petit rappel mathématique : la factorielle d'un entier n, notée n!, est égale à 1x2x3x....x(n-1)xn. Le résultat devient très vite très grand.
Par exemple 5!=120, 10!=3628800, 20! est de l'ordre de 2.433E+18.

La fonction long fact renvoie un résultat de type long pour lequel la valeur maximale est 9223372036854775807, soit de l'ordre de 9.223E+18. Elle est contenue dans Long.MAX_VALUE.

Comme 21! (de l'ordre de 5.109E+19) dépasse cette valeur, le résultat fourni par la fonction est faux.

Une solution pour améliorer la situation est d'utiliser la classe BigInteger contenue dans java.math. Elle permet de calculer avec des entiers ayant un grand nombre de chiffres.

    import java.math.BigInteger;
    
    public class factoriel2 {
      
     public static BigInteger fact(int i) {
       if (i==0)
	return new BigInteger("1");
       else {
	 BigInteger bi=new BigInteger(""+i);
	 return (bi.multiply(fact(i-1)));
       }
     }
    
     public static void main (String[] arg) {
      System.out.println(factoriel2.fact(40).toString(10));
     }
    }

Ce programme donne les résultats suivants :
20!=2432902008176640000
21!=51090942171709440000
40!=815915283247897734345611269596115894272000000000