Enoncé

Fermé
meriem - 9 févr. 2008 à 16:15
 amigo - 10 févr. 2008 à 18:13
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

2 réponses

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 835
9 févr. 2008 à 22:43
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
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