1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| nb %= 3001; // nb doit pas etre trop grand
// la traduction n'est valide que pour des nombres petit, il est impossible
// de traduire 1 456 833 par exemple, je pose ici une limite arbitraire à 3000
// je prend le modulo de nb pour avoir un nombre >= 0 et <= 3000
std::string result = "";
// rien à dire ici
unsigned int div = 1000;
// le premier diviseur à tester, le nombre maximum qu'on peut traduire
// est >= 1 000 et < 10 000, d'où div = 1 000
unsigned int logdiv = 3;
// == log10(div), (hardcodé se qui le rend probablement moins compréhensible)
while(div) {
// tant que div != 0
result += values[logdiv][nb / div];
// nb / div permet de récupérer le chiffre que l'on veut traduire
// (1, puis 8, puis 8, puis 3, pour l'exemple de 1883)
// pour 1883 toujours, à la première itération logdiv == 3, (nb / div) == 1
// on va donc chercher la valeur de values[3][1] (== "M")
// je te laisse dérouler les autres itérations.
// on ajoute la valeur récupéré (le "M") au résultat
nb %= div;
// pour nb == 1883, première itération (div == 1000), 1883 % 1000 == 883
// le but est de pouvoir passer au chiffre suivant en "supprimant" le "1"
// qu'on vient de traiter
div /= 10;
// nb est 10 fois plus petit (en ordre de grandeur), il faut ajuster
// le diviseur (nb est en base décimale)
// ce 10 n'a rien de magique, si nb était donné en binaire on aurait 2 etc..
--logdiv;
// logdiv == log10(div), encore une fois hardcodé ici, je me sers de
// log10(10*n) == log10(n) + 1
} |
Partager