next up previous contents
suivant: Exercice 5 - Vigenere monter: Programmation en C précédent: Programmation en C   Table des matières

Exercice 4 - Changement de base

Il est usuel lors de chiffrements de convertir les messages en nombres. Un message "abcdfg" peut se représenter par la suite de nombres "$1$ $2$ $3$ $4$ $6$ $7$". Vous remarquez que l'on numérote les lettres à partir de $1$ de sorte qu'un message puisse être représenté par un nombre en base $27$ sans que des $0$ apparaissent dans sa représentation. La formule générale permettant de calculer la valeur en base $10$ d'un nombre représenté en base $B$ s'obtient en multipliant les chiffres par des puissances successives de $B$. Par exemple : $3724 = 3B^3 + 7B^2 + 2B^1 + 4B^0$. Ce qui se réécrit $3724 = (((3)B + 7)B+ 2)B + 4$. Le message "abcdfg" correspond donc à la valeur $(((((1)27 + 2)27 + 3)27 + 4)27 + 6)27 + 7$ en base $27$. On simplifie les algorithmes de conversion en inversant l'ordre des lettres, donc en calculant $N = 1 + 27(2 + 27(3 + 27(4 + 27(6 +
27(7))))) = 103711969$. On effectue la conversion vers la base $B$ en effectuant des division successives par $B$. On retrouve le premier chiffre en calculant $N\ mod\ 27 = 103711969\ mod\ 27 = 1$. On divise ensuite $N$ par $27$ et on procède de même pour obtenir les chiffres suivants. On a donc $N / 27 = 103711969 / 27 = 3841184$, le deuxième chiffre est $3841184\ mod\ 27 = 2$. On continue : $3841184 / 27 = 142266$, le troisième chiffre est donc $142266\ mod\ 27 = 3$... On s'arrête que le nombre à convertir est nul.

basesVide.c


#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;
}


next up previous contents
suivant: Exercice 5 - Vigenere monter: Programmation en C précédent: Programmation en C   Table des matières
klaus 2010-08-05