Enoncé

meriem -  
 amigo -
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. Sacabouffe Messages postés 9427 Date d'inscription   Statut Membre Dernière intervention   1 863
     
    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?
    0
  2. amigo
     
    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.
    0