Convertir nombre en base donné (JAVA)

Fermé
Rakada - 24 janv. 2014 à 18:18
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 25 janv. 2014 à 20:58
Bonjour,
Le titre n'est pas très clair je vous l'accorde mais je voulais faire simple et court ! Bref je suis en terminal et je travaille sur un mini projet ou je bloque pas mal. Le but est de convertir un nombre N donné en représentation décimale vers une base b quelconque choisie par l'utilisateur. La base b devras être comprise entre 2 et 36 inclus. Je pensé faire un modulo pour avoir le reste et une division pour avoir le chiffre du modulo, bref c'est un peu casse-tête ! Voilà j'aurais aimé avoir des idées pour comment parvenir à mes fins !
Merci d'avance.
PS : je précise que je code avec Java avec le logiciel Java's cool.


A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 janv. 2014 à 19:36
"en représentation décimale vers une base b quelconque"
Attention au vocabulaire, si c'est une base 'b' ce n'est pas décimal (sauf si b=10...)

"Je pensé faire un modulo pour avoir le reste et une division pour avoir le chiffre du modulo"
L'idée est bonne, c'est comme ça qu'il faut que tu fasses.

"La base b devras être comprise entre 2 et 36 inclus"
Ce ne sont pas des valeurs prises au hasard, Java aussi le fait sur cet intervalle, cela permet de manipuler un alphabet avec les 10 chiffres et 26 lettres.

Rappel :

N = n0 + 10.n1 + 100.n2 + 1000.n3... = n0 + 10.( n1 + 10.( n2 + 10.( n3... )))
= b0 + b.b1 + b².b2 + b³.b3... = b0 + b.( b1 + b.( b2 + b.( b3 ... )))
0
"N = n0 + 10.n1 + 100.n2 + 1000.n3... = n0 + 10.( n1 + 10.( n2 + 10.( n3... )))
= b0 + b.b1 + b².b2 + b³.b3... = b0 + b.( b1 + b.( b2 + b.( b3 ... )))"

Que signifie cette égalité ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 janv. 2014 à 12:28
C'est la décomposition d'un nombre en chiffres.

Exemple en décimal : 1234 = 4 + 3*10 + 2*100+ 1*1000 = 4 + 10 * ( 3 + 10 * ( 2 + 10 * (1 )))

C'est comme cela qu'on en déduit la décomposition par division et reste successive.

[ 4 + 10 * ( 3 + 10 * ( 2 + 10 * (1 ))) ] / 10 = ( 3 + 10 * ( 2 + 10 * (1 ))) il reste 4
[ 3 + 10 * ( 2 + 10 * (1 )) ] / 10 = ( 2 + 10 * (1 )) il reste 3
[ 2 + 10 * (1 ) ] / 10 = ( 1 ) il reste 2
[ 1 ] / 10 = 0 il reste 1

On récupère bien les chiffres 1,2,3,4 de la décomposition de 1234 en base 10.

Tu peux faire pareil dans n'importe quelle base, en divisant N par b tu obtiens b0 en reste et le quotient N' = b1 + b.( b2 + b.( b3 ... )) permet de calculer ensuite b1, b2, b3...

Exemple en hexadécimal :

1234 / 16 = 77 il reste 2
77 / 16 = 4 il reste 13
4 / 16 = 0 il reste 4

Donc 1234 = 2 + 16 * (13 + 16 * (4)) = 2 + 16 * 13 + 16² * 4
Les chiffres hexadécimaux de 1234 sont donc 4, 13, 2, que l'on représentera "4d2"
0
Voilà j'ai réussi ! ça me donne ça pour la valeur 1234 en base de 16 :

void main() {
println("Taper un nombre :");
int N = readInteger();
println("Taper une base :");
int b = readInteger();
int r0 = N / b;
int b0 = N % b;
int r1 = r0 / b;
int b1 = r0 % b;
int r2 = r1 / b;
int b2 = r1 % b;
String hex2 = Integer.toHexString(b2);
String hex1 = Integer.toHexString(b1);
String hex = Integer.toHexString(b0);
println(hex2+""+hex1+""+hex);
}

Après par contre je ne sais pas si il faut que je répète ça pour chaque chiffre entré en plus, j'aimerais faire plus simple pour n'importe quel nombre car le programme que je viens de faire de marche que pour un nombre de 4 chiffre pas plus. Pour faire plus il faudrait que je rajoute des b3 et r3, etc mais je pense qu'on peut faire plus simple mais je ne vois pas :/ .
PS: le résultat obtenus en tapant 1234 en base de 16 et bien 4d2 ;)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 janv. 2014 à 20:58
Je pense qu'il faut que tu évites l'utilisation de la méthode Integer.toHexString, ce n'est valable que pour la base 16, mais si tu prends b=17, 18... ça ne marchera plus.

En plus c'est "de la triche", le but de ton programme c'est de tout faire toi même, sinon tu utiliserais directement la méthode Integer.toString(n,b) qui fait déjà tout.

"il faudrait que je rajoute des b3 et r3"
Effectivement, d'autant que si tu prends des bases petites, tu vas avoir beaucoup de chiffres.
Par exemple 1234 donne "10011010010" en base 2... si tu gardes que b0, b1, b2 tu ne pourrais pas dépasser n=7 pour la base 2, c'est franchement peu !
Il faut donc que tu utilises une boucle, afin d'avoir autant de b/r que nécessaire sans avoir à tous les coder toi même les uns à la suite des autres.
0