Factoriel
Fermé
mohamed
-
30 déc. 2009 à 13:40
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 30 déc. 2009 à 17:45
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 30 déc. 2009 à 17:45
2 réponses
nabil07
Messages postés
140
Date d'inscription
vendredi 14 septembre 2007
Statut
Membre
Dernière intervention
10 avril 2014
63
30 déc. 2009 à 14:26
30 déc. 2009 à 14:26
Bonjour,
void main(){
float result = 1; // 0!=1
int i,lim;
printf(" Factoriel de 20\n");
printf("Entrer un entier pour calculer le factoriel:");
scanf("%i",lim);
if(lim>0){
for(i=1;i<=lim;i++){
result=result*i;
}
}
printf("%i! = %f",lim,result);
}
void main(){
float result = 1; // 0!=1
int i,lim;
printf(" Factoriel de 20\n");
printf("Entrer un entier pour calculer le factoriel:");
scanf("%i",lim);
if(lim>0){
for(i=1;i<=lim;i++){
result=result*i;
}
}
printf("%i! = %f",lim,result);
}
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 817
30 déc. 2009 à 14:37
30 déc. 2009 à 14:37
Salut,
Voici un exemple :
Si t'as des questions, n'hésite pas.
Cdlt,
Voici un exemple :
#include <stdio.h>
int fact(int nb) {
int res=1;
if(nb<0) return -1;
while(nb)
res*=nb--;
return res;
}
int main(void) {
int nb;
int res;
puts("Calcul de factoriel");
printf("Nombre: ");
fflush(stdout);
scanf("%d",&nb);
res=fact(nb);
if(res==-1) {
fputs("nombre negatif\n",stderr);
return 1;
}
printf("%d!=%d\n",nb,res);
return 0;
}
Si t'as des questions, n'hésite pas.
Cdlt,
Pacorabanix
Messages postés
3245
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
658
30 déc. 2009 à 17:21
30 déc. 2009 à 17:21
attention, l'auteur du sujet voulait pouvoir calculer des factorielles jusqu'à 20! . Avec des int il y aura très probablement un problème de taille de variable (dès 13! il me semble, sur la plupart des machines).
Ce problème est bien sûr aisément contournable si on utilise un long, mais il faut encore vérifier que ça joue.
(En pratique, pour du calcul scientifique on utiliserait probablement des flottants d'ailleurs)
Ce problème est bien sûr aisément contournable si on utilise un long, mais il faut encore vérifier que ça joue.
(En pratique, pour du calcul scientifique on utiliserait probablement des flottants d'ailleurs)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 817
>
Pacorabanix
Messages postés
3245
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
30 déc. 2009 à 17:33
30 déc. 2009 à 17:33
Très juste. J'avais même pas fait attention.
Ce problème est bien sûr aisément contournable si on utilise un long, mais il faut encore vérifier que ça joue.
Pour les long, ça ne marchera pas non plus, car comme tu dis "sur la plupart des machines", le long équivaut au int.
Par contre, il est tout à fait possible d'utiliser le type long long (C99). Cela marchera très bien.
En pratique, pour du calcul scientifique on utiliserait probablement des flottants d'ailleurs
Pas pour les calculs justes. Les flottants introduisent des erreurs d'arrondis. Par exemple pour la cryptographie, jamais on utilisera des flottants.
Pour le calcul de factoriels (à moins de chercher qu'un arrondi...), on utiliserait plutôt les BIG Num qu'on utilisera facilement via une bibliothèque (comme libssl).
Ce problème est bien sûr aisément contournable si on utilise un long, mais il faut encore vérifier que ça joue.
Pour les long, ça ne marchera pas non plus, car comme tu dis "sur la plupart des machines", le long équivaut au int.
Par contre, il est tout à fait possible d'utiliser le type long long (C99). Cela marchera très bien.
En pratique, pour du calcul scientifique on utiliserait probablement des flottants d'ailleurs
Pas pour les calculs justes. Les flottants introduisent des erreurs d'arrondis. Par exemple pour la cryptographie, jamais on utilisera des flottants.
Pour le calcul de factoriels (à moins de chercher qu'un arrondi...), on utiliserait plutôt les BIG Num qu'on utilisera facilement via une bibliothèque (comme libssl).
Pacorabanix
Messages postés
3245
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
658
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
30 déc. 2009 à 17:45
30 déc. 2009 à 17:45
merci pour la correction (long long) !
30 déc. 2009 à 14:30
void main()
void main() est un mauvais prototype. main renvoie un int.
float result = 1; Vaut mieux prendre des entiers pour calculer sous peine d'avoir des erreurs d'arrondis.
scanf("%i",lim); Il faut mettre l'adresse de lim, soit &lim et non lim.