Convertir un nombre en base 26
Bonjour,
J'aimerai avoir un avis extérieur sur mon code, sur l'algo en lui même.
Soyer indulgent.
J'ai besoin de convertir mes nombres en base 26.
Comme pour les colonnes d'Excel/
Je me limite à "A" à "ZZ" soit 702.
Je n'utilise pas le 0
J'ai l'impression que je n'ai pas choisit la meilleur voie
Cordialement
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| public class Grille {
private static String table26 = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static char nombreVersTable26(int nombre) {
//le nombre doit être supérieur ou égale à 1 et inférieur ou égale à 26
return table26.charAt(nombre);
}
public static String numeroVersTable26(final int numeroToConvert) {
int numero = numeroToConvert;
if(numeroToConvert < 1 || numeroToConvert > 702) {
throw new IllegalArgumentException("Le nombre à convertir doit être compris entre 1 et 702");
}
if(numero < 27) {
return "" + nombreVersTable26(numero%27);
}
String numeroTable26 = "";
do {
int reste = numero % 26;
numero = numero / 26;
if(reste == 0) {
numero = numero -1;
numeroTable26 = nombreVersTable26(numero) + numeroTable26;
reste = 26;
numeroTable26 += nombreVersTable26(reste);
numero = 0;
} else {
numeroTable26 = nombreVersTable26(reste) + numeroTable26;
}
} while(numero > 0);
return numeroTable26;
}
public static int indexOfChar(char c) {
return table26.indexOf(c);
}
public static double table26VersNombre(final String chaineToConvert) {
String chaine = new StringBuilder(chaineToConvert.toUpperCase()).reverse().toString();
double nombre = 0;
for(int i=0;i<chaine.length();i++) {
nombre += Math.pow(26, i) * indexOfChar(chaine.charAt(i));
System.out.println("indexe" + indexOfChar(chaine.charAt(i)));
}
return nombre;
}
public static void main(String [] args) {
//for(int i=26;i <10000;i = i + 26) {
for(int i=1;i <10000;i++) {
String numero =numeroVersTable26(i);
double resultat = table26VersNombre(numero);
System.out.println(
i +" " +
numero + " " +
resultat
);
if(i !=resultat ) {
System.out.println(
"******");
}
}
}
} |
Convertir nombre en basz 26
Bonjour, :D
Citation:
Envoyé par
CoderInTheDark
... J'ai besoin de convertir mes nombres en base 26.
Comme pour les colonnes d'Excel/
Je me limite à "A" à "ZZ" soit 702.
Je n'utilise pas le 0 ...
Là, c'est très ennuyeux, car tu te prives de l'écriture de tous les nombres comportant un zéro hors de la première position à gauche; tu te condamnes ainsi à l'utilisation d'une suite lacunaire d'entiers.
Le recours à la base 26 implique le recours à 26 symboles dont les valeurs respectives s'étalent de (0) à (25); le plus simple consiste à attribuer à chacun d'eux la valeur décalée d'une unité de leur rang alphabétique:
Val('.') = Rang('.') - 1 ;
ainsi Val('A') = 1 - 1 = 0 ; Val('Z') = 26 - 1 = 25 et Val('ZZ') = 25 + 26*25 = 675 .
La programmation utilisera la liste ASCII des caractères:
Val('.') = Ord('.') - Ord('A') = Ord('.') - 65 .
Convertir un nombre en base 26
Bonjour,
Citation:
Envoyé par
NVCfrm
Salut. C'est un peu marrant tout ça : Qu'on parle de base et qu'on ne pense une seule fois a traiter avec la puissance n-1de la base.
Pour n = nombre d'elements a traiter avec la somme des elements.
Bien entendu il n'est pas question de sauter le Zero ...
C'est bien justement le problème, évoqué dès le début (#02] et qui contraint d'utiliser la liste alphabétique des mots comportant une ou deux majuscules ('A', 'B' ... , 'Z' , 'AA' , 'AB' ... 'ZZ') ...
Il ne s'agit pas d'une numération de position.