Des nombres trop grands

ivanov Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
docjeepe Messages postés 6 Statut Membre -
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:
    * #include <stdio.h>
    * main()
    * {
    *     char op ;
    *     int n1, n2 ;
    *     printf ("operation souhaitee, Christophe?(+ ou *)") ;
    *     scanf ("%c", &op);
    *     printf ("donnez le premier nombre");
    *     scanf("%ld", &n1);
    *     printf ("donnez le deuxieme nombre");
    *     scanf("%ld", &n2);
    *     if (op == '+') printf ("leur somme est : %ld ", n1+n2) ;     
    *              else printf ("leur produit est : %ld ", n1*n2);
    *              system ("pause");  
    * }

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.

3 réponses

docjeepe Messages postés 6 Statut Membre
 
Une solution simple serait de faire ça avec des tableaux :

Si tu dois coder une nombre de 100 chiffres, tu fais un tableau de 100 cases de type char (1 octet).

ensuite tu fais tes calculs en parcourant les cases de tes tableaux et en ecrivant le résultat dans un tableau résultat.
Tu geres tes retenues comme au CE2, et le tour est joué !

ça n'est pas la solution optimale, mais c'est peut-etre l'une des plus simples.

voila.
0
ivanov Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
mouais...pourquoi pas.mais bon j'ai commencé par le faire avec des listes chainées:
et je comprends pas normalement ça devrais marcher..
		  /*addition et multiplication*/





#include <stdio.h>

#include <stdlib.h>



static long int *create(void)

{

 return malloc (2 * sizeof(long int));

}



static void convert (long int array[], long int val, long int a, long int b)

{

 long int const base = 10;



 if (val>=base)

 {

  a = ((a + b) - base);

  b = 1;

  array[0] = b;

  array[1] = a;

 }

 else

 {

  array[0] = 0;

  array[1] = a + b;

 }

}



static long int *add (long int a, long int b)

{

 long int *const p = create ();



 if (p!= NULL)

 {

  long int const val = (a + b);



  convert (p, val, a, b);



 }

 return p;

}



static long int *mul (long int a, long int b)

{

 long int *const p = create();

 if (p!= NULL)

 {

  long int const val = (a * b);



  convert (p, val, a, b);

 }

 return p;

}



static void onexit (void)

{

 system ("pause");

}



int main (void)

{

 int ret = EXIT_SUCCESS;

 char buf[256];

 int op;



 atexit (onexit);



 printf ("operation souhaitee (+ ou *)?\n");



 for(;;)

 {



  fgets (buf, sizeof buf, stdin);

  op = buf[0];



  if (op == '+' || op =='*')

  {

   break;

  }

 }



 printf ("donnez le premier nombre\n");



 if (fgets (buf, sizeof (buf), stdin) != NULL)

  {

   long int a = strtol (buf, NULL, 10);



   printf ("donnez le deuxieme nombre\n");



   if (fgets (buf, sizeof (buf), stdin) != NULL)

   {

    long int b = strtol (buf, NULL, 10);

    long int *p = NULL;





    switch (op)

    {



    case'*':

     p = mul (a,b);

     break;



    case'+':

     p = add(a,b);

     break;



    default:

     printf("Erreur bizarre\n");

     ret = EXIT_FAILURE;

    }



    if(p != NULL)

    {

     printf("le nombre est [%ld][%ld] en base 10\n", p[0], p[1]);

     free (p), p = NULL;

    }

   }

   else

   {

    ret = EXIT_FAILURE;

   }

  }

  else

  {

   ret = EXIT_FAILURE;

  }

  return ret;

}



voila...mais je ne comprends pas.Dès que je choisis de passer à des nombres supèrieurs à 10...marche pas.Je ne vois pas mon erreur.si quelqu'un peut m'aider..ça serait sympa.je galère sur ce truc depuis 3 semaines!
0
pascal
 
Je crois que c'est un problème de declaration de variable.
0
docjeepe Messages postés 6 Statut Membre
 
Re salut.

Alors il y a un pb dans ton code :

Tu dois remplacer la fonction convert par deux autres fonctions:
une pour l'addition et une pour la multiplication.

remplace la fonction convert par ces deux fonctions la :

static void convertAdd (long int array[], long int val, long int a, long int b)

{

 long int const base = 10;
 
 if (val>=base)
 {

/*Le % sert à faire le modulo. */

  array[0] = ((a + b) / 10)%base;
  array[1] = ((a + b) % base);
 }

 else
 {
  array[0] = 0;
  array[1] = a + b;
 }

}



static void convertMul (long int array[], long int val, long int a, long int b)

{

 long int const base = 10;
 
 if (val>=base)
 {

/*Le % sert à faire le modulo. */

  array[0] = ((a * b) / 10)%base;
  array[1] = ((a * b) % base);
 }

 else
 {
  array[0] = 0;
  array[1] = a * b;
 }

}


ensuite remplace tes appels à la fonction convert par :

convertAdd pour l'addition
convertMul pour la multiplication

Voila et la ca marche mieux.

@+
0