Algorithme addition de nombres de bases kelconk

cs_AlexMAN
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
- 16 juin 2004 à 10:43
Gord21_cs
Messages postés
20
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
27 mai 2008
- 17 juin 2004 à 12:37
Bonjour,

Voila, j'ai un ptit souci avec un algo d'addition de nombre de bases kelconk : il marche apparement "parfaitement", mais jorai aimé savoir savoir kel optimisations joré pu lui apporter :

int Add(int nbr_prem, char *prem, int nbr_sec, char *sec, int nbr_base, char *base)
{
char *p = base;
char *result, *r = result;
int ret = 0;
int rang_prem, rang_sec;
int f = max(nbr_prem, nbr_sec);
int t;
int i;

if (nbr_prem < nbr_sec) {
t = nbr_sec - nbr_prem;
for (i = 0; i < t ; ++i) {
prem[t + i] = prem[i];
prem[i] = base[0];
}

} else if (nbr_sec < nbr_prem) {
t = nbr_prem - nbr_sec;
for (i = 0; i < t; ++i) {
sec[t + i] = sec[i];
sec[i] = base[0];
}
}

result = (char *)calloc(f + 1, 1);

for (i = f - 1; i >= 0; --i) {
while (*base) {if (*base prem[i]) rang_prem base - p;if (*base sec[i]) rang_sec base - p;
base++;
} rang_prem +ret; ret 0;
base = p;
rang_prem += rang_sec;
if (rang_prem > nbr_base - 1) {
ret++;
rang_prem -= nbr_base;
}
result[i + 1] = base[rang_prem];
}
if (!ret) {
for (i = 0; i < strlen(result) - 1; ++i) {
result[i] = result[i + 1];
}
result[i] = 0;
} else {
result[0] = ret;
result[f + 1] = 0;
}

printf("%s", result);

free(result);
return 0;

}

Si kelkun prefere voir le code indenté, j'enverrai le code par mail...

Merci d'avance ++

Alhexman

6 réponses

Gord21_cs
Messages postés
20
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
27 mai 2008

16 juin 2004 à 12:40
A quoi correspondent les arguments que tu passes à ta fonction ?

d.rogo :)
0
cs_AlexMAN
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
16 juin 2004 à 12:46
taille du premier chiffre, premier chiffre, taille du 2eme chiffre, 2eme chiffre, taille de la base, base...
0
Gord21_cs
Messages postés
20
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
27 mai 2008

16 juin 2004 à 13:00
Si la différence de taille entre tes deux nombre n'est que de 1, est-ce que ton addition fonctionne correctement ?
d.rogo :)
0
cs_AlexMAN
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
16 juin 2004 à 13:05
uè regarde le code :

if (nbr_prem < nbr_sec) {
t = nbr_sec - nbr_prem;
for (i = 0; i < t ; ++i) {
prem[t + i] = prem[i];
prem[i] = base[0];
}

} else if (nbr_sec < nbr_prem) {
t = nbr_prem - nbr_sec;
for (i = 0; i < t; ++i) {
sec[t + i] = sec[i];
sec[i] = base[0];
}
}

ca decale la chaine et comble le trou par les zero de la base pour ne pas changer la valeur de la chaine
0

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

Posez votre question
Gord21_cs
Messages postés
20
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
27 mai 2008

17 juin 2004 à 12:36
Je n'utiliserais pas i en dehors de la boucle for :

if (!ret) {
for (i = 0; i < strlen(result) - 1; ++i) {
result[i] = result[i + 1];
}
result[i] = 0;

Pour ce qui est de l'optimisation, si tu as l'intention d'utiliser de nombreuses fois tes nombres(additions, multiplications successives) et s'il peuvent être grands tu auras peut-être intérêt à les enregistrer à l'envers (1234 sous la forme 4321).
Ainsi, tu le retournes une fois à l'acquisition et une fois à l'affichage ce qui t'évites de les décaler à chaque opération.

d.rogo :)
0
Gord21_cs
Messages postés
20
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
27 mai 2008

17 juin 2004 à 12:37
Si je ne me trompe, tu as un dépassement d'indice.

result[f + 1] = 0;

d.rogo :)
0