PB de calcul( incorecte) avec dev-c++ !!!

Fermé
rim-k212 Messages postés 4 Date d'inscription vendredi 25 décembre 2009 Statut Membre Dernière intervention 27 décembre 2009 - 25 déc. 2009 à 21:16
rim-k212 Messages postés 4 Date d'inscription vendredi 25 décembre 2009 Statut Membre Dernière intervention 27 décembre 2009 - 27 déc. 2009 à 21:00
Bonjour,
je suis un débutants en programmation j'ai un petit probléme que je compte sur vous pour le résoudre
le programe doit calculer le factoriel d'un entier
le calcul est correct si le nombre est inférieur a 13
sinon le resultat est incorrect
voici le message d'erreur qu'envoie le compilateur :
13 [Warning] return type of 'main' is not `int'
voici le code source :

#include <stdio.h>
#include <stdlib.h>

unsigned long f( unsigned long a)
{
unsigned long i=1,v=1;
for (i=1;i<=a;++i){
v=v*i;
}
return(v);
}
unsigned long main()
{
unsigned long c,a;
printf("entrer l'entier que vous voulez savoir son factoriel \n\n");
scanf("%lu",&a);
c=f(a);
printf("%lu ! = %lu",a,c);
getch();

}



merci d'avance je compte sur vous !
A voir également:

5 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
26 déc. 2009 à 02:52
13 [Warning] return type of 'main' is not `int'

et bien la fonction main() est de type int, pas de type "unsigned long" (dans le standard C et C++). C'est la raison de ce "Warning". Mais cela n'a aucune importance sur votre programme.

Ensuite, vous devez prendre une décision si le résultat est plus grand que 13 ou non, c'est bien ça ?

Alors il suffit de mettre après l'affichage un bloc "if (condition) { instructions si condition vrai} else {instructions si condition fausse}"
0
rim-k212 Messages postés 4 Date d'inscription vendredi 25 décembre 2009 Statut Membre Dernière intervention 27 décembre 2009
26 déc. 2009 à 15:08
merci pour ta reponse "Pacorabanix" mais c'est pas ca
le calcul est correcte si le nombre est strictement inférieur a 13
n n!
0 1
1 1
2 2
3 6
4 24
5 120
6 720
7 5 040
8 40 320
9 362 880
10 3 628 800
11 39 916 800
12 479 001 600
13 6 227 020 800 ( il me donne une autre résultat , il me donne 1 932 053 504 )
dés que j'entre un nombre supérieur a 12 il me donne un résultat incorrect
je crois que j'ai sorti du domaine de définition des variables de type "unsigned long"

aidez moi svp
merci
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
27 déc. 2009 à 02:02
ah d'accord, ok je comprends mieux ce que tu voulais dire.

Oui tu as raison, la raison est que tu as dépassé la capacité d'un unsigned long, et donc tu obtiens des résultats inattendus.
Il te faut trouver des bibliothèques de classe(s) qui peuvent te créer un type d'entier plus long.
Essaye long long ou unsigned long long déjà, mais tu auras vite le même problème (mais j'ai un doute sur ce type, si c'est seulement en C ou pas).

Sinon quel est ton but ? Il est rare d'avoir besoin de si grands nombres exacts.
Si une approximation te suffit (avec beaucoup de chiffres significatifs), alors tu peux simplement utiliser des double ou des unsigned double. Tu iras déjà bien plus loin (si tu compares avec le résultat d'une calculette, tous les chiffres affichés seront corrects, et même bien plus). Si c'est juste pour t'entrainer à programmer tu peux observer ici les limites des types de base.
Si tu veux faire des calculs avec des entiers en gardant une précision maximale, il te faut te tourner vers des bibliothèques spéciales comme je l'ai mentionné (mais je n'en ai pas sous la main désolé)

bonne suite
0
rim-k212 Messages postés 4 Date d'inscription vendredi 25 décembre 2009 Statut Membre Dernière intervention 27 décembre 2009
27 déc. 2009 à 03:27
merci mon pote jé bien compris
tu sait pas ou je peux trouver des biblio de classes ?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
27 déc. 2009 à 13:39
cherche "Big Integer Library C++" (ou des variantes), Big Integer = Gros entier en anglais. Tu peux essayer Large integer aussi.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bonjour essayer ceci:
#include<stdio.h>
#include<conio.h>
main()
{
      int i,fact,N;
      printf("entrez la val de N : ");
      scanf("%d",&N);
     if (N==0)
     fact=1;
     else
     { 
    
      for(fact=1,i=1;i<=N;i++)
      {
       fact *=i;
      
      }
      }
      printf("le factoriel est: %d \n",fact);

 getch();
 return 0;     
}
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
27 déc. 2009 à 17:31
Excuse-moi, mais en quoi cela résout son problème ?
0
rim-k212 Messages postés 4 Date d'inscription vendredi 25 décembre 2009 Statut Membre Dernière intervention 27 décembre 2009
27 déc. 2009 à 21:00
merci pour votre reponse mais c'est tjr la méme erreur !!
0