grands nombres en C - C - Programmation
Marsh Posté le 14-05-2010 à 19:19:04
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+,
Marsh Posté le 14-05-2010 à 19:27:20
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
Marsh Posté le 14-05-2010 à 19:51:08
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.
Marsh Posté le 14-05-2010 à 20:33:13
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
Marsh Posté le 14-05-2010 à 21:32:22
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: |
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 ! """ |
??? 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...
Marsh Posté le 14-05-2010 à 21:54:57
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....
Marsh Posté le 15-05-2010 à 03:34:08
badrinfo a écrit : Bonjour , |
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+,
Marsh Posté le 15-05-2010 à 09:51:59
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??
Marsh Posté le 15-05-2010 à 11:16:17
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+,
Marsh Posté le 15-05-2010 à 11:46:23
dac ,je vous remercie,je vais essayer de faire avec tous elements que j'ai reçu .
A+
Marsh Posté le 16-05-2010 à 19:10:12
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...
Marsh Posté le 16-05-2010 à 23:06:02
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+,
Marsh Posté le 14-05-2010 à 19:08:04
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.