IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Calcul de la factorielle de n , en java avec boucle for


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Calcul de la factorielle de n , en java avec boucle for
    Bonjour je suis nouveau sur votre forum, je suis débutant en programmation (3 semaines) j'ai découvert le forum en tapant sur google 'algorithme factorielle en java. J'en ai retrouvé un, mais il n'y avait pas de méthode main. Je l'ai donc complété.
    Je fais encore souvent beuacoup de petites fautes, mais aussi des grosses. Je n'ai pas pu exécuter mon code car je ne sais pas utilisé Eclipse. J'aimerais savoir si ce que j'ai fait est juste ?

    Je dois calculer la factorielle de n
    Je dois utilisés une boucle for et pas de formule mathématique.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    *import ordinateur.clavier;
    *import ordinateur.ecran;
     
     
    public class factorielle 
    {
    	public static void CalculerLaFactorielleden (int n)
    	{
    	// PRECONDITION : Le nombre entré est un nombre entier (un int), pas de nombre à virgules
    	// Le nombre entré est un nombre entier positif (pas de nombre négatif )
    	// Invariant : 0!=1
    	// 	      (x+1)!=(x+1)*x! (x est un Naturel.)
     
    		int fact = 1;
    		for (int i=1; i<=n; i++) {
    		fact = fact * i;
    		}
    		return fact;
    		}
     
    		System.out.println(fact);
    	}
     
    	// POSTCONDITION : Le résultat est affiché
     
    	public static void main (String [] args)
    	{
    	final int max = m;
    	ecran.afficher ("Entrez un Int");
    	int n = clavier.lireUnInt();
    	}
    }

  2. #2
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    Par défaut
    Salut,

    Dans un premier temps, essaye de compiler le code.
    Il y a des erreurs au niveau des accolades.

    Et tu as le System.out qui est placé au milieu de nul part.

  3. #3
    Expert confirmé
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Points : 4 539
    Points
    4 539
    Par défaut
    salut.
    voila une version de ton code corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.util.Scanner;
    public class factorielle 
     
    {
     
    	public int CalculerLaFactorielleden (int n)
    	{
    	// PRECONDITION : Le nombre entré est un nombre entier (un int), pas de nombre à virgules
    	// Le nombre entré est un nombre entier positif (pas de nombre négatif )
    	// Invariant : 0!=1
    	// 	      (x+1)!=(x+1)*x! (x est un Naturel.)
     
    		int fact = 1;
    		for (int i=1; i<=n; i++) 
    		{
    		fact = fact * i;
    		}		
    		return fact;	
    	}
     
    	// POSTCONDITION : Le résultat est affiché
     
    	public static void main (String [] args)
    	{	
    	System.out.println("donner un entier :");
    	Scanner sc = new Scanner(System.in);
    	int n = sc.nextInt();	
    	factorielle objetFact = new factorielle ();
    	System.out.println("le factorielle de "+n+" est : "+objetFact.CalculerLaFactorielleden(n));
    	}
     
     
    }
    bonne chance.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Sinon, dans un style dépouillé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class Factorielle {
     
        public static void main(String[] args)
        {
            long n = Long.parseLong(args[0]);
            System.out.println("Résultat : " + factorielle(n));
        }
     
        private static long factorielle(long n)
        {
            if (n > 1) return n * factorielle(n-1);
            return n;
        }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Sinon, dans un style dépouillé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class Factorielle {
     
        public static void main(String[] args)
        {
            long n = Long.parseLong(args[0]);
            System.out.println("Résultat : " + factorielle(n));
        }
     
        private static long factorielle(long n)
        {
            if (n > 1) return n * factorielle(n-1);
            return n;
        }
    }
    C'est bien d'expliqué que dans le cas là. Il y a des appels récursifs, donc que la pile d'appel grossi et il y a un risque (en général) d'avoir un dépassement de mémoire.

    Ceci dit, pour la factoriel, il y a un dépassement de la taille des int à peine au huitième appel (à vue de nez), donc pas de risque d'avoir de problème de mémoire

    Mais c'est bien d'en être conscient.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jack Sparrow Voir le message
    C'est bien d'expliqué que dans le cas là. Il y a des appels récursifs, donc que la pile d'appel grossi et il y a un risque (en général) d'avoir un dépassement de mémoire.

    Ceci dit, pour la factoriel, il y a un dépassement de la taille des int à peine au huitième appel (à vue de nez), donc pas de risque d'avoir de problème de mémoire

    Mais c'est bien d'en être conscient.
    La capacité d'un int est de 2.147.483.647, on a de la marge, ce n'est certainement pas la factorielle de 9 qui va l'atteindre...
    Mais là, l'exemple est en long, donc la limite est de 9.223.372.036.854.775.807... c'est loin...

    Pour le reste, effectivement, c'est un appel récursif... la simplification de code n'est pas transcendante pour la factorielle mais ça donne un exemple concret d'une utilisation.
    L'exemple fait l'impasse sur la factorielle de 0 et ne traite pas l'exception sur un nombre négatif... bref, il y a de quoi étoffer...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    Par défaut
    En fait, c'était 13 pour les int et 21 pour les long. Je viens de vérifier. Mais ce n'est pas ça qui va provoquer un dépassement de pile.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par slim_java Voir le message
    salut.
    voila une version de ton code corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.util.Scanner;
    public class factorielle 
     
    {
     
    	public int CalculerLaFactorielleden (int n)
    	{
    	// PRECONDITION : Le nombre entré est un nombre entier (un int), pas de nombre à virgules
    	// Le nombre entré est un nombre entier positif (pas de nombre négatif )
    	// Invariant : 0!=1
    	// 	      (x+1)!=(x+1)*x! (x est un Naturel.)
     
    		int fact = 1;
    		for (int i=1; i<=n; i++) 
    		{
    		fact = fact * i;
    		}		
    		return fact;	
    	}
     
    	// POSTCONDITION : Le résultat est affiché
     
    	public static void main (String [] args)
    	{	
    	System.out.println("donner un entier :");
    	Scanner sc = new Scanner(System.in);
    	int n = sc.nextInt();	
    	factorielle objetFact = new factorielle ();
    	System.out.println("le factorielle de "+n+" est : "+objetFact.CalculerLaFactorielleden(n));
    	}
     
     
    }
    bonne chance.
    Merci c'est sympa! mais je n'ai jamais utilisé la class java util scanner, je n'ai pas tout compris

    par quoi je peux modifier dans la méthode main les points suivant ?
    -scanner sc= new scanner (system.in) ---- > je ne comprends pas
    -int n = sc.nextInt(); -----> c'est pour lire le n entré par l'utilisateur ? je peux donc utilisé ma méthode int n= clavier.lireUnInt ?
    -factorielle objetFact = new factorielle ();--> çà fait quoi ?

    je me sens largué

  9. #9
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Scanner sc = new Scanner(System.in);
    permet de déclarer un objet Scanner qui lira les caractère saisis au clavier dans la console.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int n = sc.nextInt();
    permet de lire l'entier suivant saisie. Je ne sais pas ce que fais ta méthode clavier.lireUnInt donc je ne peux pas te dire si tu peux l'utiliser à la place.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    factorielle objetFact = new factorielle ();
    permet de créer un objet de type factorielle sur lequel tu pourra ensuite appeler ta méthode CalculerLaFactorielleden.
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Salut,

    J'ose te donner cet exemple avec Scanner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
       import java.util.Scanner;
     
        public class Factoriel
       {
           public static void main (String [] args)
          {
     
          /*
          VALEUR MINI d'un INT.
          >>>>  int mon_int = Integer.MIN_VALUE;
          La valeur minimale d'un int est -2147483648
          
          
          VALEUR MAXI d'un INT.
          >>>>  int mon_int = Integer.MAX_VALUE;
          La valeur maximale d'un int est 2147483647
          
          
          VALEUR MINI d'un LONG
          >>>>  long mon_long = Long.MIN_VALUE;
          La valeur minimale d'un long est -9223372036854775808
          
          
          VALEUR MAXI d'un LONG
          >>>>  long mon_long = Long.MAX_VALUE;
          La valeur maximale d'un long est 9223372036854775807
          */
     
     
             /*int n, i, factoriel = 1; // maxi de n = 13
             int max = 13;
             String lib = "(1 a 13 avec int),";
             String lib2 = "int"; */
     
          	//OU BIEN:
             long n, i, factoriel; // maxi de n = 20
             int max = 20;
             String lib = "(1 a 20 avec long),";
             String lib2 = "long";
    /**Mais pas les deux en mème temps
     Compiler avec l'un ou l'autre
     Tel que ci-dessus ce sera avec un long
     Envisager l'utilisation avec Big  Integer ou Decimal je ne sais plus
     pour aller plus loin que 20 ce qui est peu. */
     
             boolean encore = true;
             Scanner sc=new Scanner(System.in);
     
             while(encore) // pour tester plusieurs valeur (sortie en entrant 0)
             {
                factoriel = 1;
                System.out.print("\nSaissisez un entier " + lib + " ou 0 pour terminer: ");
                n = sc.nextInt();
     
                if (n == 0)
                   encore = false;
                else
                {
                   if (n <= max)
                   {
                      for(i=1; i <= n; i++) 
                      {
                         factoriel=factoriel*i;
                         // si on veut la liste de 1 a la valeur entrée
                         System.out.println("\nLa factorielle de " + i + " est " + factoriel); 
                      }
                      // OU BIEN si on ne veut que le résultat de la valeur entrée 
                      //System.out.println("\nLa factorielle de " + n + " est " + factoriel);
                   }
                   else
                   {
                      System.out.println("\nLe maxi pour un " + lib2 + " est " + max);
                      factoriel = 1;
                   }
                }
             }
          } 
       }
    Cordialement,

    Dan

  11. #11
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Novembre 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Novembre 2017
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Aide sur BigInteger pour le calcul de la factorielle des Bigint
    Bonjour,
    Je suis débutante dans le monde de l'informatique et j'essaie d'écrire un programme pour le calcul de la factorille des grand nombre (BinInteger)
    Pour celà, j'ai reussie à ecrire un programme sans faute syntaxique (la chance!! ) mais au moment de l’exécution des lignes et des lignes rouuges et je ne comprends pas la cause
    je vous mets mon programme ci-dessous, si jamais une personne pourrait m'aider à comprendre ce qui ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import java.math.BigInteger;
    import java.util.Scanner;
     
    public class exo73tp1 {
    	private static Scanner clavier = new Scanner(System.in);
     
    	public static void main(String[] args) {
    		BigInteger n;
    		System.out.println("Donnez un nombre entier");
    		n = clavier.nextBigInteger();
    		System.out.println(n + "! = " + facto2(n));
    		}
    //A partir de la valeur n=12 le programme ne donne plus des valeurs correctes			
     
    //Soltuion BigInteger
     
    	public static BigInteger facto2(BigInteger n) {
    		BigInteger res = BigInteger.valueOf(1);
    		if (n.equals(0))
    			return res;
    		else
    			return res=n.multiply((facto2(n.subtract (res)))); //Je veux travailler avec une fonction recurssive
     
    //Message d'erreur: java.math.BigInteger.subtract(Unknown Source)
     
    		}
    }

  12. #12
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 072
    Points : 7 974
    Points
    7 974
    Par défaut
    Le message d'erreur est pourtant explicite :
    Exception in thread "main" java.lang.StackOverflowError
    Tu appelles récursivement une méthode sans jamais mettre une sortie (un nombre maximal d'appel) donc un moment donné, tu obtiens cette erreur. Ou alors ne pas utiliser de récursion et préférer une méthode itérative.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Novembre 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Novembre 2017
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Merciii, mais du coup je peut pas appeler la fonction facto2 à l'interieur de la fonction elle même, en gros je peux pas faire une fonction récursive dans le cas des BigInteger??

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Tu appelles récursivement une méthode sans jamais mettre une sortie (un nombre maximal d'appel) donc un moment donné, tu obtiens cette erreur. Ou alors ne pas utiliser de récursion et préférer une méthode itérative.
    Je suis pas sûr de comprendre ce que tu veux dire. En récursivité on ne donne jamais un nombre d'appel maximal.
    On définit un cas de base, et un cas général récursif qui réduit le problème en se rapprochant du cas de base, jusqu'à finir par l'atteindre.

    Ici le cas de base est supposé être clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (n.equals(0))
      return res;
    Et le cas général aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    else
      return res=n.multiply((facto2(n.subtract (res))));
    Cas de base, factorielle de zéro. Elle vaut 1.
    Cas général, factorielle d'un entier supérieur à zéro. C'est cet entier multiplié par la factorielle de l'entier moins un. En prenant un entier supérieur à zéro, et en lui retranchant 1, on se rapproche bel et bien du cas de base zéro.
    Le raisonnement récursif n'a pas le moindre problème.

    C'est juste qu'on ne peut pas comparer un BigInteger au littéral 0.
    0 est un int qui se fait auto-inbox en Integer. Ce n'est pas un BigInteger. On ne peut pas le comparer à un BigInteger.

    Il faut comparer n à BigInteger.ZERO.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 072
    Points : 7 974
    Points
    7 974
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Je suis pas sûr de comprendre ce que tu veux dire. En récursivité on ne donne jamais un nombre d'appel maximal.
    Dans certains cas je pense qu'il faut tout de même une limite. Que ça soit iteratif ou recursif, vouloir afficher une fractale de "profondeur" infinie en temps réel avec du raymarching ou autres sans y mettre des limites me semble peu possible (avec par exemple un shader GLSL). Enfin ça c'est mon idée du truc
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Novembre 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Novembre 2017
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Je suis pas sûr de comprendre ce que tu veux dire. En récursivité on ne donne jamais un nombre d'appel maximal.
    On définit un cas de base, et un cas général récursif qui réduit le problème en se rapprochant du cas de base, jusqu'à finir par l'atteindre.

    Ici le cas de base est supposé être clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (n.equals(0))
      return res;
    Et le cas général aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    else
      return res=n.multiply((facto2(n.subtract (res))));
    Cas de base, factorielle de zéro. Elle vaut 1.
    Cas général, factorielle d'un entier supérieur à zéro. C'est cet entier multiplié par la factorielle de l'entier moins un. En prenant un entier supérieur à zéro, et en lui retranchant 1, on se rapproche bel et bien du cas de base zéro.
    Le raisonnement récursif n'a pas le moindre problème.

    C'est juste qu'on ne peut pas comparer un BigInteger au littéral 0.
    0 est un int qui se fait auto-inbox en Integer. Ce n'est pas un BigInteger. On ne peut pas le comparer à un BigInteger.

    Il faut comparer n à BigInteger.ZERO.
    Ohhh ouiii c'est ça qui le bloque, j'ai eu un problème avec le (res) au début et je l'ai corrigé mais j'ai pas pensé au Zero

    Mercii beaucoup!!

  17. #17
    Membre régulier

    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 55
    Points : 111
    Points
    111
    Par défaut
    Bonsoir,
    @Jack Sparrow je pense que pour le calcul de la factorielle sur une machine 32bits N ne doit pas dépasser 14

  18. #18
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    On est sûr du vieux message, donc je répond à la place de ce bon vieux Sparrow.

    En base 64, avec du long, on arrive à calculer jusque 20! (61 bits)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    1! = 1 , log_2(1) = 0.0
    2! = 2 , log_2(2) = 1.0
    3! = 6 , log_2(6) = 2.584962500721156
    4! = 24 , log_2(24) = 4.584962500721157
    5! = 120 , log_2(120) = 6.906890595608519
    6! = 720 , log_2(720) = 9.491853096329676
    7! = 5040 , log_2(5040) = 12.29920801838728
    8! = 40320 , log_2(40320) = 15.29920801838728
    9! = 362880 , log_2(362880) = 18.46913301982959
    10! = 3628800 , log_2(3628800) = 21.791061114716957
    11! = 39916800 , log_2(39916800) = 25.250492733354253
    12! = 479001600 , log_2(479001600) = 28.835455234075408
    13! = 6227020800 , log_2(6227020800) = 32.5358949522165
    14! = 87178291200 , log_2(87178291200) = 36.3432498742741
    15! = 1307674368000 , log_2(1307674368000) = 40.25014046988262
    16! = 20922789888000 , log_2(20922789888000) = 44.25014046988262
    17! = 355687428096000 , log_2(355687428096000) = 48.337603311132966
    18! = 6402373705728000 , log_2(6402373705728000) = 52.507528312575275
    19! = 121645100408832000 , log_2(121645100408832000) = 56.75545582601886
    20! = 2432902008176640000 , log_2(2432902008176640000) = 61.07738392090622
    21! = -4249290049419214848 , log_2(-4249290049419214848) = NaN
    En base 32, on arrive effectivement à 12!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    1! = 1 , log_2(1) = 0.0
    2! = 2 , log_2(2) = 1.0
    3! = 6 , log_2(6) = 2.584962500721156
    4! = 24 , log_2(24) = 4.584962500721157
    5! = 120 , log_2(120) = 6.906890595608519
    6! = 720 , log_2(720) = 9.491853096329676
    7! = 5040 , log_2(5040) = 12.29920801838728
    8! = 40320 , log_2(40320) = 15.29920801838728
    9! = 362880 , log_2(362880) = 18.46913301982959
    10! = 3628800 , log_2(3628800) = 21.791061114716957
    11! = 39916800 , log_2(39916800) = 25.250492733354253
    12! = 479001600 , log_2(479001600) = 28.835455234075408
    13! = 1932053504 , log_2(1932053504) = 30.84748790099983 (valeur fausse !!)
    14! = 1278945280 , log_2(1278945280) = 30.252307393450973
    Je ne répondrai à aucune question technique en privé

Discussions similaires

  1. Calcul d'une factorielle en shell (Linux)
    Par MSM_007 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 28/10/2007, 21h43
  2. Programme de calcul d'une factorielle
    Par hassen_I3 dans le forum Assembleur
    Réponses: 1
    Dernier message: 14/12/2006, 19h35
  3. Calcul de la factorielle d'un nombre naturel
    Par Sadgunner dans le forum Pascal
    Réponses: 9
    Dernier message: 20/06/2006, 22h56
  4. Exécutable Java avec JRE intégré
    Par clawhammer dans le forum JBuilder
    Réponses: 2
    Dernier message: 06/10/2003, 17h26
  5. Réponses: 2
    Dernier message: 26/05/2003, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo