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

rim-k212 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
rim-k212 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   663
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   663
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   663
 
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
cisco
 
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   Statut Membre Dernière intervention   663
 
Excuse-moi, mais en quoi cela résout son problème ?
0
rim-k212 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
merci pour votre reponse mais c'est tjr la méme erreur !!
0