Enoncé

onjour,
je veux avoir l'algorithme et program de cet énoncé:'convertir un nombre entié dans une base quelconque comprise entre 2 et 16 en utilisant la modularité'..............svvvvvvp c urgent
merci d'avance B
Configuration: Windows XP
Internet Explorer 6.0

2 réponses

  1. Salut meriem
    Jette un œil sur ce topic et adapte : Conversion

    Pour résumer et si q la base dans laquelle tu veux convertir.

    Soit x un entier positif.
    Alors x = ∑ x_n q^n où pour tout n x_n Є {0,1,...,q-1} et où sup {x_n / n≠0} < +∞
    Pour trouver les x_n:
    1) Soit N = sup {x_n / n≠0}
    Alors N = sup {n / q^n ≤ x}

    2) Après tu peux tout faire par modularité
    x ≡ y_N [ p^N ] où y_N Є [1,p^N - 1]
    x - y_N = x_N * p^N
    Et ensuite même chose :
    y_N ≡ y_(N-1) [ p^(N-1) ]
    x - x_N * p^N = y_(N-1) + x_(N - 1) * p^(N - 1)
    Etc... avec les y_n...

    Ça te va?
    1. bonjour meriem

      tu as peut etre deja touvé la solution à ton problème, sinon je te propose la mienne.
      voici le programme Pascal et quelques explications.

      {Programme de notation d'un nombre entier compris entre 0 et 10^9 en base 10
      en notation du meme nombre en une base quelconque conprise
      entre 2 (binaire) et 16 (hexadecimal).
      au dela de 10^9 il a un depassement de capacité pou le type Longint

      1)determiner le nombre de caracteres maxi necessaire pour ecrire ce nombre
      ex: 500 en base 16 -> 16^1=16; 16^2=256; 16^3=2998 => il faut au mois 3 caracteres.
      => le tableau rang[] aura n=3 colonnes

      2)decomposer nombre en somme de base^n-1 à base^0 (base^n-1 + base^n-2 ... + base^0)
      pour cela on utilise l'operateur Div qui donne le quotient de la division de 2 entiers
      et l'operateur Mod qui donne le reste de la division de 2 entiers
      -on a vu que pour 500 en base 16 on a besoin de n=3 colonnes
      -500/16^n-1 = 500/16^2 = 500/256 = 1 et reste 244
      -244/16^n-2 = 244/16^1 = 244/16 = 15 et reste 4
      -4/16^n-3 = 4/16^0 = 4/1 = 4 et reste 0
      dans le tableau rang[] on note le quotient de la division entiere donné par Div
      le tableau rang aura 3 elements: [1],[15],[4]

      3)ecrire nombre suivant la base choisie
      utiliser les codes ASCII :
      caracteres:['0'.....'9'] ['A'....'F']
      ascii: [48.......57] [65......46]

      ex: pour 500 en base 16
      colonne 1 -> [1] < 9 -> 1+48 =50 -> chr(50)='1'
      colonne 2 -> [15] > 9 -> 15+55=70 -> chr(70)='F'
      colonne 3 -> [4] > 9 -> 4+48 =52 -> cr(52)='4'
      mis bout à bout cela donne '1F4' qui est bien la notation de 500 en base exadecimal

      essaye de refaire le calcul pour 500 en base 8 (octal)
      le resultat est '764'
      }

      Program ConversionBase;
      Uses crt;
      Var
      base , car, i : integer ;
      nombre : longint;
      rang : array[1..32] of longint;
      txt , texte : String ;

      Function Pow (a : integer; n : integer) : longint;
      Var
      j : integer;
      p : longint;
      Begin
      p:=1;
      for j:=1 to n do p:=p*a;
      pow:=p;
      End;

      Begin
      clrscr;
      Write('Entrez un nombre entier compris entre 0 et 1000000000: >');
      readln(nombre);
      writeln;

      write('En quelle base (entre 2 et 16) voulez-vous afficher ce nombre: >');
      readln(base);

      {determiner le nombre de caracteres maxi necessaire pour ecrire ce nombre}
      car:=0;
      while (Pow(base,car) < nombre) do car:=car+1;

      {decomposer nombre en somme de base puissance n à puissance 0 (base^n + base^n-1 ... + base^0)}
      {memoriser cette decomposition dans le taleau rang[]}
      For i := car DownTo 1 do
      begin
      rang[car - i + 1] := nombre div Pow(base , (i - 1));
      nombre := nombre Mod Pow(base , (i - 1));
      end;

      {ecrire nombre suivant la base choisie}
      texte := '';
      For i := 1 To car do
      begin
      If (rang[i] <= 9) Then txt := Chr(rang[i] + 48) else txt := Chr(rang[i] + 55);
      texte := concat(texte , txt);
      end;

      writeln;
      writeln('Resultat: >',texte);
      readln;

      End.