Il est usuel lors de chiffrements de convertir les messages en
nombres. Un message "abcdfg" peut se représenter par la suite de
nombres "
". Vous remarquez que l'on numérote
les lettres à partir de
de sorte qu'un message puisse être
représenté par un nombre en base
sans que des
apparaissent
dans sa représentation. La formule générale permettant
de calculer la valeur en base
d'un nombre représenté en base
s'obtient en multipliant les chiffres par des puissances successives
de
. Par exemple :
. Ce qui se
réécrit
. Le message "abcdfg" correspond
donc à la valeur
en base
. On simplifie les algorithmes de conversion en inversant l'ordre
des lettres, donc en calculant
. On effectue la conversion vers la base
en
effectuant des division successives par
. On retrouve le premier
chiffre en calculant
. On divise
ensuite
par
et on procède de même pour obtenir les chiffres
suivants. On a donc
, le deuxième
chiffre est
. On continue :
, le
troisième chiffre est donc
... On s'arrête que le
nombre à convertir est nul.
#include<stdio.h> #define BASE 27 /************************************************/ /* Retourne le rang de la lettre a dans l'alphabet. 'a' est de rang 1, 'b' de rang 2, etc. */ char rankOfLetter(char a) { return 0; } /************************************************/ /* Retourne la lettre de rang r dans l'alphabet. */ char letterOfRank(char r) { return 0; } /************************************************/ /* Convertit le nombre nb en base 27, place les lettres calculees dans la chaine c. (ne pas oublier le 0 a la fin de c...) */ void base27Of10(char* c, unsigned long nb) { } /************************************************/ /* Convertit en base 10 le message contenu dans c. */ unsigned long base10Of27(char* c) { return 0; } /************************************************/ /* Convertit en base 10 le mot "abcdfg", puis le reconvertit de nouveau en base 27. */ int main() { char c[7] = "abcdfg", d[7]; unsigned long b10 = base10Of27(c); printf("%lu\n", b10); base27Of10(d, b10); printf("%s\n", d); return 0; }