Calculer le factorielle d'un nombre. // (Dev-C++) - C - Programmation
Marsh Posté le 02-02-2014 à 14:22:06
!
Je vois 2 petites erreurs dans ton programme :
Code :
|
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 :
|
Code :
|
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 :
|
Et bien sûr, il faut aussi initialiser ta variable Fac à 1.
En espérant t'avoir aidé
Edit : ton programme ne tient pas compte non plus du cas X=1 on dirait Je mettrais comme ça à la place :
Code :
|
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
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é |
Si tu décomposes ta boucle, voici ce que tu obtiens :
Pour X = 5, ta boucle :
Code :
|
donne :
Code :
|
Ce que je propose donne :
Code :
|
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
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+,
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+,
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
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)