Additio de deux grand nombre

sarlissa Messages postés 7 Date d'inscription lundi 11 mai 2009 Statut Membre Dernière intervention 19 octobre 2011 - 4 avril 2010 à 20:11
sarlissa Messages postés 7 Date d'inscription lundi 11 mai 2009 Statut Membre Dernière intervention 19 octobre 2011 - 8 avril 2010 à 23:45
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

pop70 Messages postés 181 Date d'inscription mardi 6 avril 2010 Statut Membre Dernière intervention 7 janvier 2012 10
6 avril 2010 à 13:50
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
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
6 avril 2010 à 15:23
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 ?
0
sarlissa Messages postés 7 Date d'inscription lundi 11 mai 2009 Statut Membre Dernière intervention 19 octobre 2011
7 avril 2010 à 22:39
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
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
8 avril 2010 à 10:10
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
8 avril 2010 à 11:22
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); 
} 
0
sarlissa Messages postés 7 Date d'inscription lundi 11 mai 2009 Statut Membre Dernière intervention 19 octobre 2011
8 avril 2010 à 23:45
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.
0
Rejoignez-nous