Dans le logiciel de calcul de table, le numéro de ligne est représenté par un nombre décimal normal, et le numéro de colonne est représenté par une chaîne de caractères qui est une combinaison d'alphabets supérieurs commençant par «A». Cette notation est appelée notation A1 car la cellule supérieure gauche est représentée par «A1» dans cette méthode.
Il existe 26 types d'alphabets en majuscules, alors n'est-ce pas vraiment un nombre 26-aire? Cependant, il a des propriétés différentes des nombres n-aires généraux.
Si vous le touchez d'une manière ou d'une autre, vous risquez de tomber dans un piège inattendu. C'est facile, mais j'ai pensé à la différence.
Comparons ces trois.
Nombre décimal | 26 ans | Notation A1 |
---|---|---|
0000 | AAAA | ---- |
0001 | AAAB | ---A |
0002 | AAAC | ---B |
... | ... | ... |
0025 | AAAZ | ---Y |
0026 | AABA | ---Z |
0027 | AABB | --AA |
0028 | AABC | --AB |
... | ... | ... |
Dans les nombres n-aires généraux, il y a un symbole correspondant à zéro. C'est "0" en décimal et "A" en 26.
En revanche, dans les numéros de colonne en notation A1, il n'y a pas de symbole correspondant à zéro. Le tableau ci-dessus utilise "-" à la place pour le représenter. Si vous remplacez "-" par "A", il sera difficile à manipuler car le deuxième chiffre commence par "A" lorsqu'il est transporté jusqu'à deux chiffres.
Dans les nombres 26-aires, le chiffre le plus significatif n'est jamais "A" (sauf s'il est zéro), donc ce n'est pas un problème.
Par conséquent, le numéro de colonne en notation A1 a implicitement l'information du nombre de chiffres, qui a probablement une signification essentielle. Et, par la quantité de ces informations, la capacité à exprimer est plus élevée même avec le même nombre de chiffres que le nombre à 26 aires.
\begin{equation}
f(d) =
\begin{cases}
0, & d = \mbox{'A'} \\
1, & d = \mbox{'B'} \\
2, & d = \mbox{'C'} \\
... \\
25, & z = \mbox{'Z'} \\
\end{cases}
\end{equation}
Si vous définissez la fonction $ f $ de cette manière, la conversion de nombres 26-aires en nombres décimaux sera
\Sigma_{i=0}^{D_{max}}{f(D[i])*26^i}
Peut être exprimé comme. Cependant, $ D $ est un nombre à 26 aires, $ D [i] $ représente le caractère i-ième chiffre à partir de la droite, et $ D {max} $ représente le nombre de chiffres maximum de $ D $. .. Eh bien, c'est un calcul de conversion radix général, n'est-ce pas?
Pour convertir un numéro de colonne en notation A1 en nombre décimal, chaque chiffre commence à 1 au lieu de zéro, donc en ajoutant +1 à la valeur de $ f $,
\Sigma_{i=0}^{D_{max}}{(f(D[i])+1)*26^i}
Peut être exprimé comme.
Il s'avère que lorsqu'il est représenté par N caractères, il y a une différence dans le nombre qui peut être représenté par $ \ Sigma_ {i = 0} ^ {N-1} {26 ^ i} $.
Implémentons la conversion du nombre 26-aire et du numéro de colonne au format A1 en nombre décimal en Java.
public class Main {
public static int f(char d) {
return d - 'A';
}
public static int fromBase26Num(String base26Num) {
int base10Num = 0;
for (int i = 0; i < base26Num.length(); i++) {
base10Num += (f(base26Num.charAt(base26Num.length() - 1 - i))) * Math.pow(26, i);
}
return base10Num;
}
public static int fromA1ColNum(String a1ColNum) {
int base10Num = 0;
for (int i = 0; i < a1ColNum.length(); i++) {
base10Num += (f(a1ColNum.charAt(a1ColNum.length() - 1 - i)) + 1) * Math.pow(26, i);
}
return base10Num;
}
public static void main(String[] args) {
System.out.println("[0 est affiché]");
System.out.println(fromBase26Num("AAAA"));
System.out.println("[1 est affiché]");
System.out.println(fromBase26Num("AAAB"));
System.out.println(fromA1ColNum("A"));
System.out.println("[27 est affiché]");
System.out.println(fromBase26Num("AABB"));
System.out.println(fromA1ColNum("AA"));
}
}
Résultat d'exécution
[0 est affiché]
0
[1 est affiché]
1
1
[27 est affiché]
27
27
OK
Je ne l'ai pas écrit ici, mais convertir un nombre décimal en un numéro de colonne au format A1 est encore plus fastidieux. https://github.com/ttk1/A1Util Je ne sais pas si c'est en demande, mais j'ai mis la mise en œuvre ici. (Veuillez pardonner que le nom de la variable et le nom de la fonction ne sont pas cool!)
La conversion d'un nombre décimal en un numéro de colonne au format A1 est plus fastidieuse.
Cependant, comme l'a commenté @ saka1029, c'était moins gênant que prévu.
Recommended Posts