Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

Il y a 73 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

des nombres trop grands!

 
n°11767
Ivanov
Profil : Jeune recrue
Posté le 05-03-2005 à 17:58:48  profilanswer
 

salut!voilà j'ai un petit problème pour un programme:
je dois gérer les grand nombres pour 2 opérations: la multiplication et l'addition.Par exemple:

Code :
  1. #include <stdio.h>
  2. main()
  3. {
  4.     char op ;
  5.     int n1, n2 ;
  6.     printf ("operation souhaitee, Christophe?(+ ou *)" ) ;
  7.     scanf ("%c", &op);
  8.     printf ("donnez le premier nombre" );
  9.     scanf("%ld", &n1);
  10.     printf ("donnez le deuxieme nombre" );
  11.     scanf("%ld", &n2);
  12.     if (op == '+') printf ("leur somme est : %ld ", n1+n2) ;   
  13.              else printf ("leur produit est : %ld ", n1*n2);
  14.              system ("pause" );
  15. }


 
seulement voila, il y a problème: sur mon compilateur, le type "unsigned long int" fait 4 octets.
Cela signifie que je peux coder des nombres non signés de 0 à 4294967295.Moi, je veux additionner, multiplier des nombres ayant plus de 100 chiffres!!Quelqu'un pourrait m'aider??
merci d'avance.

n°11769
P-Y
Profil : Vieux de la vieille
Posté le 05-03-2005 à 20:49:12  profilanswer
 

Il faut que tu geres toi meme la multiplication et l'addition, en stockant non pas le nombres sur juste un int, mais sur un tableau d'int. Et ppres ce sera a toi de recoder une addition et une multiplicaiton qui travaillent non pas sur des int mais sur des nombres stockes sous ce format. ;)


Message édité par P-Y le 05-03-2005 à 21:36:42
n°11770
podone
POD first ONE of best game
Profil : Habitué
Posté le 05-03-2005 à 21:08:31  profilanswer
 

C'est chaque fois le même problème quand on gagne trop souvent à l'Euromillions.  :pfff:  
 
:jesors:

n°11772
Ivanov
Profil : Jeune recrue
Posté le 05-03-2005 à 22:48:54  profilanswer
 

Je ne l'ai pas fait avec des tableaux mais autrement:

Code :
  1. /*addition et multiplication*/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. static long int *create(void)
  5. {
  6. return malloc (2 * sizeof(long int));
  7. }
  8. static void convert (long int array[], long int val, long int a, long int b)
  9. {
  10. long int const base = 10;
  11. if (val>=base)
  12. {
  13.   a = ((a + b) - base);
  14.   b = 1;
  15.   array[0] = b;
  16.   array[1] = a;
  17. }
  18. else
  19. {
  20.   array[0] = 0;
  21.   array[1] = a + b;
  22. }
  23. }
  24. static long int *add (long int a, long int b)
  25. {
  26. long int *const p = create ();
  27. if (p!= NULL)
  28. {
  29.   long int const val = (a + b);
  30.   convert (p, val, a, b);
  31. }
  32. return p;
  33. }
  34. static long int *mul (long int a, long int b)
  35. {
  36. long int *const p = create();
  37. if (p!= NULL)
  38. {
  39.   long int const val = (a * b);
  40.   convert (p, val, a, b);
  41. }
  42. return p;
  43. }
  44. static void onexit (void)
  45. {
  46. system ("pause" );
  47. }
  48. int main (void)
  49. {
  50. int ret = EXIT_SUCCESS;
  51. char buf[256];
  52. int op;
  53. atexit (onexit);
  54. printf ("operation souhaitee (+ ou *)?\n" );
  55. for(;;)
  56. {
  57.   fgets (buf, sizeof buf, stdin);
  58.   op = buf[0];
  59.   if (op == '+' || op =='*')
  60.   {
  61.    break;
  62.   }
  63. }
  64. printf ("donnez le premier nombre\n" );
  65. if (fgets (buf, sizeof (buf), stdin) != NULL)
  66.   {
  67.    long int a = strtol (buf, NULL, 10);
  68.    printf ("donnez le deuxieme nombre\n" );
  69.    if (fgets (buf, sizeof (buf), stdin) != NULL)
  70.    {
  71.     long int b = strtol (buf, NULL, 10);
  72.     long int *p = NULL;
  73.     switch (op)
  74.     {
  75.     case'*':
  76.      p = mul (a,b);
  77.      break;
  78.     case'+':
  79.      p = add(a,b);
  80.      break;
  81.     default:
  82.      printf("Erreur bizarre\n" );
  83.      ret = EXIT_FAILURE;
  84.     }
  85.     if(p != NULL)
  86.     {
  87.      printf("le nombre est [%ld][%ld] en base 10\n", p[0], p[1]);
  88.      free (p), p = NULL;
  89.     }
  90.    }
  91.    else
  92.    {
  93.     ret = EXIT_FAILURE;
  94.    }
  95.   }
  96.   else
  97.   {
  98.    ret = EXIT_FAILURE;
  99.   }
  100.   return ret;
  101. }

 
 
mais ça ne marche pas...ya pas de bug au niveau du code...est ce quelqu'un peut m'aider à régler ce problème:a partir du moment ou l'utilisateur donne un chiffre supérieur à 10...ça plante.pourquoi!!!!
Je ne vois pa mon erreur.ça fait 3 semaines que je suis dessus.je craque.:(

n°11774
podone
POD first ONE of best game
Profil : Habitué
Posté le 06-03-2005 à 13:34:47  profilanswer
 

Pourquoi base 10 les nombres ne sont-ils pas en base 16 ?

n°11775
P-Y
Profil : Vieux de la vieille
Posté le 06-03-2005 à 14:05:25  profilanswer
 

Ben c'est normal que ca ne marche pas avec des nombres superieurs a 10, ton programme n'est pas prevu pour...
Et aussi, si on fait une multiplication ca ne marche pas, vu que dans les 2 cas tu appelles convert qui fait une addition

n°11777
podone
POD first ONE of best game
Profil : Habitué
Posté le 06-03-2005 à 15:38:37  profilanswer
 

Tu t'embarques dans une sacrée galère !  :(  
Déjà les nombres que tu récupères sont en hexa
Exemple : tu saisis 255 tu vas récupérer 0xFF
Ensuite si tu veux le convertir en base 10 : buf[2] = 2, buf[1] = 5 et buf[0] = 5 il faut diviser le nombre par 10 et récupérer le reste par modulo 10 et ceci tant que la division te donne un nombre supérieur à 10.
Sur des grands nombres c'est une vraie galère parce que si tu veux gérer les débordements tu dois travailler en short(16 bits) et int pour le résultat d'opération (32 bits) et gérer tous les reports de calcul.
Sans parler du problème de la gestion du signe.
Ni de ta fonction strtol qui ne peut pas fonctionner sur des grands nombres.
Bonne chance !  :pt1cable:


Message édité par podone le 06-03-2005 à 15:42:34
n°11778
podone
POD first ONE of best game
Profil : Habitué
Posté le 06-03-2005 à 16:15:09  profilanswer
 

A mon sens (mais je peux me tromper) le plus efficace doit être de préparer le travail avec des tableaux pour un nombre à 100 chiffres cela fait 1000 tableaux. Avec un résultat max sur 200 chiffres !  :ouch:


Aller à :
Ajouter une réponse