Calculer le factorielle d'un nombre. // (Dev-C++)

Calculer le factorielle d'un nombre. // (Dev-C++) - C - Programmation

Marsh Posté le 02-02-2014 à 13:48:14    

Bonjour tout le monde :
J'aimerai bien que vous me donnez un soutient pour pouvoir connaître ou j'ai commue l'erreur dans ce programme pour débutant.
Voila le code :  
#include <stdio.h>
#include <stdlib.h>
main()
{
int X,i,J,Fac;
printf (" Veuillez entrez une valeur : " );
scanf ("%d",&X);
if (X>0)  
 {for (i=2 ; i<X ; i++)
   Fac=X*(i);
   printf (" Le factorielle de %d est : %d ",X,Fac);
    }
else if(X==0)
    printf (" Le factorielle de %d est : 1\n ",X);
else
    printf(" Veuillez entrez un nombre posetive\n " );
system (" pause " );
}
Quand j'exécute le programme et je fais entrer les valeurs 1 et 2 et 3 il me donne la bon rep mais quand je saisie une valeur > 3 il me donne des faux rep.
Exp: Fact de 4=12 /// La rep vrait est 24  
Merci d'avance pour tous les gens qui veulent m'aidaient. (y)

Reply

Marsh Posté le 02-02-2014 à 13:48:14   

Reply

Marsh Posté le 02-02-2014 à 14:22:06    

:hello: !

 

Je vois 2 petites erreurs dans ton programme [:cupra] :

  • 1ère boucle for :
Code :
  1. for (i=2 ; i<X ; i++)


Ici, tu ne vas pas prendre en compte la dernière valeur de X.
ex. : si X=5, tu ne calculerais que jusqu'à la valeur 4.
Je mettrais cela à la place :

Code :
  1. for (i=2 ; i<=X ; i++)


  • Logique du calcul de la factorielle
Code :
  1. Fac=X*(i);


La factorielle est le calcul du produit des n premiers termes. Ici, tu ne calcules que le produit de 2 nombres : X qui est la dernière valeur de ta factorielle, et i qui est un nombre compris entre 2 et X-1 pour ton cas

Code :
  1. Fac=Fac*(i);


Et bien sûr, il faut aussi initialiser ta variable Fac à 1.

 

En espérant t'avoir aidé :jap:

 

Edit : ton programme ne tient pas compte non plus du cas X=1 on dirait :??: Je mettrais comme ça à la place :

Code :
  1. if( X > 1 )
  2. {
  3.     [...]
  4. }
  5. else
  6. {
  7.     [...]
  8. }


Message édité par Soileh le 02-02-2014 à 14:28:01

---------------
And in the end, the love you take is equal to the love you make
Reply

Marsh Posté le 02-02-2014 à 15:07:10    

                                Merci beaucoup pour ton aide je suis totalement d'accord avec toi pour ce qui concerne le cas de X=1.Je l'est corrigé  :)  
Mais je vois que si je fait cette boucle : for (i=1 ; i<=X ; i++)  
                                                          Le programme va encore multiplier avec X une deuxième fois et ça je le vois comme une erreur. Exp  : Valeur=5 alors le prog va faire Fac= 5*5*4*3*2*1
Je te remercie aussi pour ta proposition : Fac=Fac*(i); Mais en vérité je connais cette astuce et je voulais essayer de faire autre chose. Mais il me semble que ça ne marchera pas :??:   :pfff:

Reply

Marsh Posté le 02-02-2014 à 15:33:46    

flixton a écrit :

                                Merci beaucoup pour ton aide je suis totalement d'accord avec toi pour ce qui concerne le cas de X=1.Je l'est corrigé  :)  
Mais je vois que si je fait cette boucle : for (i=1 ; i<=X ; i++)
                                                          Le programme va encore multiplier avec X une deuxième fois et ça je le vois comme une erreur. Exp  : Valeur=5 alors le prog va faire Fac= 5*5*4*3*2*1
Je te remercie aussi pour ta proposition : Fac=Fac*(i); Mais en vérité je connais cette astuce et je voulais essayer de faire autre chose. Mais il me semble que ça ne marchera pas :??:   :pfff:


Si tu décomposes ta boucle, voici ce que tu obtiens :
Pour X = 5, ta boucle :

Code :
  1. for (i=1 ; i<=5 ; i++)


donne :

Code :
  1. Fac = 5 * 1;
  2. Fac = 5 * 2;
  3. Fac = 5 * 3;
  4. Fac = 5 * 4;
  5. Fac = 5 * 5;


Ce que je propose donne :

Code :
  1. Fac = Fac * 1;
  2. Fac = Fac * 1 * 2;
  3. Fac = Fac * 1 * 2 * 3;
  4. Fac = Fac * 1 * 2 * 3 * 4;
  5. Fac = Fac * 1 * 2 * 3 * 4 * 5;


Puis la boucle sort car i vaut 6 et est supérieure à 5.
Bien sûr, Fac aura initialement été initialisée à 1 au début du programme [:cupra]


Message édité par Soileh le 02-02-2014 à 15:36:03

---------------
And in the end, the love you take is equal to the love you make
Reply

Marsh Posté le 02-02-2014 à 15:42:47    

L'initialisation n'est pas faite (Fac=1), et si tu fais une boucle for, ce serait avec: for (i=1 ; i<=X ; ++i) { Fac *= i;} qui marche pour X entier positif ou nul.
(on peut commencer la boucle a 2 et pas 1, mais ça rend l'algo moins lisible, pour une optimisation négligeable)
A+,


Message édité par gilou le 02-02-2014 à 15:44:23

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-02-2014 à 16:13:28    

Noter aussi qu'une implémentation courante de la fonction utilise
 
int Fac2(int i, int j) {
    if (!j) return i;
    return Fac2(i*j, j-1);
}
 
et le fait que si X >= 0, Fac(X)  = Fac2(1, X);
5la forme de Fac2 permet de faire une optimisation (tail-recursion optimisation) qui évite les inconvénients des appels récursifs (pas d'accumulation de piles d'appel), tout en profitant de ses avantages.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-02-2014 à 00:40:46    

Merci beaucoup mon ami, je n'oublierai jamais ton aide (Soileh, gilou)
J'ai compris l'erreur que j'ai commue grâce à un ami qui ma bien guidé, c'est presque comme ta mienne.(Soileh)
Voila toutes les étapes qui ma donné :
Dans ta boucle, tu fais: Fac=X* (i);
donc, si on exécute à la main pour X = 4:
pour i==1 : Fac = 4 * 1
pour i==2 : Fac = 4 * 2
pour i==3 : Fac = 4 * 3
 
A chaque fois, tu écrase la valeur précédente, donc c'est la dernière valeur qui est gardée (4 * 3).
Pour calculer ta factorielle, il te faut multiplier i par le calcul de valeur de la boucle précédente:
avant la boucle, tu dois mettre Fac = 1; (parce que sinon tu vas tout multiplier par 0, ce qui va faire 0 :)  )
Ensuite pour X = 4, il te faut faire 1 * 2 * 3 * 4 = (((1 * 2) * 3) * 4), entre parenthèses, c'est la valeur Fac de la boucle précédente.
pour i == 1: Fac = 1 * 1 = Fac * 1 = Fac * i
pour i == 2: Fac = 1 * 2 = Fac * 2 = Fac * i
pour i == 3: Fac = 2 * 3 = Fac * 3 = Fac * i
pour i == 4: Fac = 6 * 4 = Fac * 4 = Fac * i
Et pourtant j'ai pu refaire un nouveau code le voila :
#include <stdio.h>
#include <stdlib.h>
main()
{
int X,i,Fac;
printf (" Veuillez entrez une valeur : " );
scanf ("%d",&X);
Fac=1;
if (X>0)  
 {for (i=X ; i>=1 ; i--)
  Fac=Fac*(i);
   printf (" Le factorielle de %d est : %d ",X,Fac);
    }
else if (X==0)
    printf (" Le factorielle de %d est : 1\n ",X);
else
    printf(" Veuillez entrez un nombre posetive\n " );
system (" pause " );
}
Je remercie tous les gens qui m'ont ouvert la porte.  
A bientôt :mrgreen: :rose2:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed