Additio de deux grand nombre

Signaler
Messages postés
7
Date d'inscription
lundi 11 mai 2009
Statut
Membre
Dernière intervention
19 octobre 2011
-
Messages postés
7
Date d'inscription
lundi 11 mai 2009
Statut
Membre
Dernière intervention
19 octobre 2011
-
bonjour je voudrais que vous m'aidiez a développez un programme qui fait la somme de deux grand nombre que l'utilisateur les entre comme des chaines de caractère j'ai essayé de faire le programme m'ai je n'arrive pas à trouver l'emplacement de l'erreur je vous pris de m'aider le plus vite possible
voici mon code:


#include <stdio.h>
#include <stdlib.h>
#include<string.h>

int convertir(char *ch,int n);
main()
{char ch1[40],ch2[40];
int nb1,nb2,n,m,i=9,cos=0,max,t[10]={0};
printf("entrer le premier nombre:");
scanf("%s",ch1);n=strlen(ch1);
printf("entrer le deuxieme nombre:");
scanf("%s",ch2);m=strlen(ch2);
/*max=(n>m)?n:m;
d=max/4+3;
t=(int*)malloc(d*sizeof(int));*/
while(n>=0 || m>=0)
{nb1=convertir(ch1,n);
nb2=convertir(ch2,m);
t[i]=(nb1+nb2+cos)%10000;
cos=(nb1+nb2+cos)/10000;
n-=4;i--;
m-=4;
}
for(i=0;i<10;i++)
printf("%4d",&t[i]);
getch();
}


int convertir(char *ch,int n)
{int i,j=3,nb=0;
char temp[5];
if(n>0)
{
for(i=n-1;i<=n-5;i--)
{temp[j]=ch[i];
j--;
}
temp[4]='\0';nb=atoi(temp);
}
return(nb);
}

et merci d'avance

6 réponses

Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
9
Ce code est en C++, il faudra changer cout << et cin >> par printf() et scanf(), mais le principe reste le même, il prend un nombre dans un tableau de char et le convertit en int. J'espère que ça t'aidera.


int main(int argc, char **argv)
{
    int tailleC = 200;
    char  chaine[tailleC]; // création d'un tableau de caractère

    for (int i = 0; i <tailleC; i++)
    {
        chaine[i] = '\0';  // initialise toutes les valeur à '\0'
    }


    cout << "Votre nombre en chaine : ";
    cin>>chaine; // demande un nombre à entrer dans le tableau de caractère


int tempInt 0, nbChar 1, varInt = 0;


    for (int i = 0; i < tailleC; i++)
    {
        if (chaine[i] != '\0')
        {
            tempInt = (int) (chaine[i] - '0');
            nbChar++; // compte le nombre de caractères entrés
        }
    }

    int exp = 1;

    for (int i = 0; i < (nbChar - 2) ; i++)
    {
        exp*=10;  // permet de creer un exposant de 10

    }

    for (int i = 0; i < tailleC; i++)
    {
        if (chaine[i] != '\0')
        {
            tempInt = (int) (chaine[i] - '0'); // reprend les valeurs du tableau
            varInt +tempInt*exp;             // multiplie chaque unité par un exposant de 10 (ex : 521 5*10² + 2*10 + 1)
            exp/=10;                           // diminue de 1 la valeur de l'exposant

        }
    }




cout << "En entier : " << varInt << endl << endl; // affiche la valeur de type integer

system ("PAUSE");
return 0;

}


Pop70
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
Bonjour,

convertir() :
- ne tient pas compte du nombre de caractères restant dans la chaine ch. Quand il en reste moins de 4, le résultat est incertain
- le for a une condition erronnée : un majorant avec i-- . Par chance (?) ton majorant est trop petit dès le départ, alors tu sors immédiatement au lieu de boucler indéfiniment.

Main() :

- printf : pas de & devant t[i], et met un espace après le %d et un \n après la boucle.
- compte le nombre de t, tu éviteras les zéros.

Après tu fais la multiplication ? et le reste ?
Messages postés
7
Date d'inscription
lundi 11 mai 2009
Statut
Membre
Dernière intervention
19 octobre 2011

merci beaucoup pour vos réponses
*pour mr pop70 je n'ai pas compris beaucoup de ce que tu as écrit parce que je connais pas le c++.
*et pour tpoinsot le problème de for je l'ai réglé j'ai juste inverser le signe > mais le programme ne marche pas
_pour le nombre de caracteres contenus dans ch il'est envoyé a la fonction convertir par le programme principale et il est affectée au variable n.
-merci pour la remarque de printf vous m'avez sauvez
-je n'ai pas bien compris pour quoi je doit faire la multiplication et le reste

je vais vous ré-expliquer le principe
je doit lire les deux chiffres en tant que chaine de caractères puis convertir les quatre derniers chiffres de chaque nombre en entier a l'aide de la fonction atoi puis les additionner et maitre les quatre derniers chiffres du résultat dans un tableau d'entier et ajouter ce qui reste au résultat de l'addition du quatre chiffres suivants et refaire la même chose jusqu'à la fin et enfin afficher le tableau inversé
si vous pouvez m'aider parce que mon programme ne fonctionne toujours pas
le voici apres avoir couriger les faute que j'ai trouvé


#include <stdio.h>
#include <stdlib.h>
#include<string.h>

int convertir(char *ch,int n);
main()
{char ch1[40],ch2[40];
int nb1,nb2,n,m,i=9,cos=0,max,t[10]={0};
printf("entrer le premier nombre:");
scanf("%s",ch1);n=strlen(ch1);
printf("entrer le deuxieme nombre:");
scanf("%s",ch2);m=strlen(ch2);
max=(n>m)?n:m;
while(max>0)
{nb1=convertir(ch1,n);
nb2=convertir(ch2,m);
t[i]=(nb1+nb2+cos)%10000;//pour que la case ne contient que 4 chiffre
cos=(nb1+nb2+cos)/10000;/*c'est le reste qui doit être ajouter a la case suivante du tableau*/
n=n-4;i--;
m=m-4;
max=max-4;
}
for(i=0;i<10;i++)
printf("%4d",t[i]);
getch();
}


int convertir(char *ch,int n)
{int i,j=3,nb=0;
char temp[5]={0};
if(n>0)
{
for(i=n-1;i>=n-5;i--)
{temp[j]=ch[i];
j--;
}
temp[4]='\0';nb=atoi(temp);
}
return(nb);
}


et merci encore une fois
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
Je te laisse ton algorithme, mais il y a mieux.

Tu dois faire l'addition par paquet de 4, sans oublier la retenue (ta variable cos), je l'ai compris, et c'est pour le fun que je te proposais de faire la multiplication de grands nombres, car c'est un peu plus "marrant".

D'abord, indente bien ton code et utilise la balise de présentation du code, dans la barre d'outils juste au dessus de la zone de réponse

Convertir :
- ta boucle passe 5 fois et bousille la pile. mets >n-5
- quand il reste moins de 4 caractères, c'est dangereux car tu lis n'importe où.

main:
plutôt que n=n-4; écris n -= 4; etc...
pour l'affichage :
printf("%d ", t[i]);
puis printf("\n") après la boucle.
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
j'ai retapé ton code, compare avec le tien pour comprendre pourquoi il ne fonctionnait pas.
J'ai un peu simplifié.

int convertir(char *ch, int n) 
{
int j, nb = 0; 
char temp[5] = {0}; 

if ( n > 0 ) 
{ 
for (j = 3; j >= 0; j--)
{
temp[j] = n > 0 ? ch[n-1] : ' '; 
n--;
} 
temp[4] = '\0';
nb = atoi(temp); 
}
return(nb); 
} 
Messages postés
7
Date d'inscription
lundi 11 mai 2009
Statut
Membre
Dernière intervention
19 octobre 2011

merci beaucoup tpoinsot
-c bien vu pour la boucle for
-pour les espaces je t'avoue que je n'ai pas y panser avant et je suis trop contente de l'apprendre
tu m'as sauver je te suis b1 reconnaissante je vais essayer de faire le programme de multiplication et si je rencontre de problème j'espère que tu me vient en secours
-et pour la balise de présentation du code je ne s'avais pas son existance
désolé pour le dérangement.