[JAVA] Notation A1 et nombre 26-aires

Notation A1

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.

Le numéro de colonne utilise 26 types de symboles, alors n'est-ce pas un nombre à 26 aires?

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.

Comparaison des nombres de colonnes de notation décimale, 26 et A1

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.

Conversion du numéro de colonne en notation A1 en nombre décimal

\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} $.

Exemple d'implémentation (Java)

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

Résumé

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!)

Postscript

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

Notation A1 et nombre 26-aires
Transformez le nombre de secondes donné en heures, minutes et secondes
Lire et écrire des fichiers
Écrire et lire des fichiers
Différence entre ps a et ps -a
Graine aléatoire corrigée dans TensorFlow et Numpy Un peu différent
Python a + = b et a = a + b sont différents
[python] week1-3: Type de nombre et opération
C'est un nombre premier ... Comptez les nombres premiers ...
Génération de nombres pseudo aléatoires et échantillonnage aléatoire
a () et a .__ call__ () ne sont pas équivalents
Créer un fichier de nombres aléatoires de 1 Mo
[Python] renvoie A [ou / et] B
C> Entrez un nombre> fgets () / sscanf ()
Créez une table de correspondance entre le numéro CE et l'entrée Uniprot à partir d'enzyme.dat