Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1572 connectés 

  FORUM HardWare.fr
  Programmation
  C

  grands nombres en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

grands nombres en C

n°1993126
badrinfo
Posté le 14-05-2010 à 19:08:04  profilanswer
 

bonjour a tous
j'ai besoin de votre aide svp je suis perdu
j'ai besoin d'additionner 2 grands nombres entiers,j'ai pensé a le faire sous forme de tableau a une dimension par exemple :
pour additionner 2 chiffres on a besoin de 2 tableaux chacun a 50 cases(ex) , et chaque case possède un chiffre, donc, en tous on aura 2 nombre de 50 chiffre chacun, et après faut faire l’addition de chaque case ,en commençant par la dernière ,et on rajoute des retenues(s’il y’ on a )a la case qui suit(comme au primaire) .
voila mais je ne sais pas par ou commencer .
merci d'avance;).

mood
Publicité
Posté le 14-05-2010 à 19:08:04  profilanswer
 

n°1993130
gilou
Modérateur
Modzilla
Posté le 14-05-2010 à 19:19:04  profilanswer
 

Positifs, tes nombres?
si oui, comme en général, INT_MAX vaut +2,147,483,647 soit 10 chiffres (a vérifier sur ton système), tu découpes ton grand nombre en tranches de 9 chiffres, ca te donne une liste de nombres, et tu ajoutes tranches a tranches en commençant par celle du bas, et en reportant la retenue à chaque étape.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1993132
badrinfo
Posté le 14-05-2010 à 19:27:20  profilanswer
 

Bonjour ,  
Merci pour ta réponse ,  
oui il s'agit bien de grands nombres positifs ,  
par contre je ne t'ai pas bien suivi et compris , tu peux détailler un peu et me montrer juste comment il faut que je commence le programme avec cette base je pourrais me débrouiller je pense  
merci d'avance

n°1993136
Un Program​meur
Posté le 14-05-2010 à 19:51:08  profilanswer
 

Tu n'auras pas plus le code pondu à ta place ici que tu ne l'as eu ailleurs.  Montre ton code et on essaiera de te dire ce qui ne va pas dedans.  Mais bon, reposer une question ici tel que tu l'as posée ailleurs à midi sans tenir compte de l'aide que tu as déjà reçu, ça n'incite pas à t'aider.


Message édité par Un Programmeur le 14-05-2010 à 19:54:39

---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1993139
badrinfo
Posté le 14-05-2010 à 20:33:13  profilanswer
 

merci pour ta réponse ,effectivement j'ai posté sur plusieurs forum et si tu me suis , tu as du voir que j'avais déjà posté un début de code mais pour info et pour les autres ,je le poste ici:
 
#include<stdio.h>
int add(int tab1[],int tab2[],int tab3[]){
int retenue=0;
int n;
int res=0;
      for(n=49;n<0;res=tab1[n]+tab2[n]+retenue){
 if(res>255){
    retenue=res/256;
    res=res-256;
 }
      tab3[n]=res;
      }
return res;
}
int main(){
int tab1[]={2,5,6,8,9,8,6,4,8,5};
int tab2[]={4,5,9,1,6,8,8,5,2,4,8,9};
int tab3[255];
int a;
a=add(tab1,tab2,tab3);
printf("%d\n",a);
return 0;
}
 
quelqun ma posé une question : """Pourquoi 49 ? Les tableaux sont bien plus petits que ça ! """
j'en suis la et je n'ai pas bien compris
Merci d'avance pour votre aide , mais pour information je ne veux pas que l'on me ponde un code , je suis veux juste être un peu guidé car je suis perdu  

n°1993148
Sve@r
Posté le 14-05-2010 à 21:32:22  profilanswer
 

badrinfo a écrit :

merci pour ta réponse ,effectivement j'ai posté sur plusieurs forum et si tu me suis , tu as du voir que j'avais déjà posté un début de code mais pour info et pour les autres ,je le poste ici:
 
#include<stdio.h>
int add(int tab1[],int tab2[],int tab3[]){
int retenue=0;
int n;
int res=0;
      for(n=49;n<0;res=tab1[n]+tab2[n]+retenue){
 if(res>255){
    retenue=res/256;
    res=res-256;
 }
      tab3[n]=res;
      }
return res;
}
int main(){
int tab1[]={2,5,6,8,9,8,6,4,8,5};
int tab2[]={4,5,9,1,6,8,8,5,2,4,8,9};
int tab3[255];
int a;
a=add(tab1,tab2,tab3);
printf("%d\n",a);
return 0;
}


 
Je ne comprends pas trop ton principe de retenue. En base 10, on n'a une retenue que si la somme dépasse 9. Toi tu la mets pour 256. On dirait presque que tu confonds "valeur numérique" et "caractère ascii". Faut pas confondre 4 et '4' car 4 c'est la valeur et '4' c'est le caractère (code ascii 68)...
 

badrinfo a écrit :

quelqun ma posé une question : """Pourquoi 49 ? Les tableaux sont bien plus petits que ça ! """
j'en suis la et je n'ai pas bien compris


??? C'est toi qui a tapé ce code non ???
Toutefois, quand deux nombres à x chiffres s'additionnent, ça peut donner un nombre à x chiffres ou bien un nombre à "x+1" chiffres...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1993153
badrinfo
Posté le 14-05-2010 à 21:54:57  profilanswer
 

merci pour ta reponse,oui je dois confondre certainement.
je voi un peu mieux la difference mais pour faire la retenu j'ai du mal je vais essayer de faire travailler ma tete et je vous tiendrais au courant mais vos remarques et votre aide sont toujours les bienvenue d'ailleurs j'en ai vraiment besoin....

n°1993171
gilou
Modérateur
Modzilla
Posté le 15-05-2010 à 03:34:08  profilanswer
 

badrinfo a écrit :

Bonjour ,  
Merci pour ta réponse ,  
oui il s'agit bien de grands nombres positifs ,  
par contre je ne t'ai pas bien suivi et compris , tu peux détailler un peu et me montrer juste comment il faut que je commence le programme avec cette base je pourrais me débrouiller je pense  
merci d'avance


Bon, je vais faire simple:
Tu veux additionner N1 = 123456789 et N2= 1987654321 et tu es dans un système ou le plus gros entier vaut 2000 (4 chiffres).
Tu découpes tes nombre par paquets de 3 chiffres:
N1 = |123|456|789|
N2 = |1|987|654|321|
Tu additionnes par paquet en tenant compte de la retenue:
789 + 321 -> 1110 donc paquet |110| et retenue 1
456 + 654 + 1 (retenue) -> 1111 donc paquet |111| et retenue 1
123 + 987 + 1 (retenue) -> 1111 donc paquet |111| et retenue 1
1 + 1 (retenue) -> 2 donc paquet |2|
Tu remet bout a bout tes paquets: |2|111|111|110| et tu obtiens la somme de N1 et N2: 2111111110
Voila le principe.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1993178
badrinfo
Posté le 15-05-2010 à 09:51:59  profilanswer
 

merci gilou pour cette explication bien detaillé ,mais j'ai encore une autre question :comme on va la decouper c'est le meme principe d'un tableau donc on doit connaitre la longueur des 2 tableaux pour savoir par quelle case doit commencer l'addition??

n°1993188
gilou
Modérateur
Modzilla
Posté le 15-05-2010 à 11:16:17  profilanswer
 

Citation :

comme on va la découper


Ben si c'est pas un entier, mais un grand nombre, la seule représentation "externe" que vous allez avoir va être sous forme d'une chaine de chiffres.
Donc se déplacer dans une chaine en partant de la fin, c'est pas très dur en C (pointeur p sur le \0 final, on le fait reculer avec p--, etc)

 

L'addition commence par la fin je vous rappelle, donc

Citation :

savoir par quelle case doit commencer l'addition


ca veut pas dire grand chose.

 

Une représentation interne que vous pouvez utiliser pour un grand entier, c'est:

 

typedef struct {
int nb_cases; /* determiné a partir de la représentation externe */
int cases[];  /* tableau de nb_cases alloué dynamiquement lorsque nb_cases a été determiné */
} grand_entier;

 

A+,

Message cité 1 fois
Message édité par gilou le 15-05-2010 à 11:16:33

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 15-05-2010 à 11:16:17  profilanswer
 

n°1993197
badrinfo
Posté le 15-05-2010 à 11:46:23  profilanswer
 

dac ,je vous remercie,je vais essayer de faire avec tous elements que j'ai reçu .
 
A+

n°1993470
Sve@r
Posté le 16-05-2010 à 19:10:12  profilanswer
 

gilou a écrit :

L'addition commence par la fin je vous rappelle


A ce propos, il y a un soucis auquel il faut penser: si on additionne 995 et 126, le résultat sera 1121. Le soucis ainsi posé, c'est que l'addition du 3° nombre 5 et du 3° nombre 6 sera placé dans la 4° case. Ainsi, on a un soucis de décalage à cause du dépassement du millier.
Je me demandais alors si ce ne serait pas plus pratique de stocker un "grand entier" à l'envers ???
Les nombres 995 et 126 seraient stockés sous forme 599 et 621.
Ainsi il suffit pour les additionner (ou autre) de balayer les tableaux dans l'ordre naturel de leurs éléments sans se prendre la tête à chercher la fin pour remonter vers le début et vérifier le décalage éventuel...


Message édité par Sve@r le 16-05-2010 à 19:10:38

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1993508
gilou
Modérateur
Modzilla
Posté le 16-05-2010 à 23:06:02  profilanswer
 

Citation :

Ainsi, on a un soucis de décalage à cause du dépassement du millier

Non, mais par contre, quand on additionne deux grands nombres de N cases, le résultat peut ne tenir que dans N+1 cases, et il faut en tenir compte. Comme on ne le sait qu'a la fin de l'opération d'addition, la somme pourrait se faire dans un grand nombre temporaire, a N+1 cases systématiquement, et on copiera le résultat du grand nombre temporaire au grand nombre résultat qui lui aura le bon nombre de cases entre N et N+1.
A+,


Message édité par gilou le 16-05-2010 à 23:06:58

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  grands nombres en C

 

Sujets relatifs
Débutant need Help en CLink error et Objective-C
Traduire une fonction aléatoire de l'algorithme en langage C ?!Code C++ Pour tester un mémoire DDR2
Langage C : passage d'un tableau à une fonctionRafraichir un GROUPBOX (C++, Win32)
bibliothèque langage Cvecteur de bits en language C !!!!
C: addition de grands nombres 
Plus de sujets relatifs à : grands nombres en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR