Algorithme addition de nombres de bases kelconk

Signaler
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
-
Messages postés
20
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
27 mai 2008
-
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

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

A quoi correspondent les arguments que tu passes à ta fonction ?

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

Si la différence de taille entre tes deux nombre n'est que de 1, est-ce que ton addition fonctionne correctement ?
d.rogo :)
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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
Messages postés
20
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
27 mai 2008

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 :)
Messages postés
20
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
27 mai 2008

Si je ne me trompe, tu as un dépassement d'indice.

result[f + 1] = 0;

d.rogo :)