[GO] A1-Notation und 26-stellige Nummer

A1 Notation

In der Tabellenberechnungssoftware wird die Zeilennummer durch eine normale Dezimalzahl dargestellt, und die Spaltennummer wird durch eine Zeichenfolge dargestellt, die eine Kombination von oberen Alphabeten ist, die mit "A" beginnen. Diese Notation wird als A1-Notation bezeichnet, da die obere linke Zelle bei dieser Methode als "A1" dargestellt wird.

Die Spaltennummer verwendet 26 Arten von Symbolen. Ist es also keine 26-stellige Zahl?

Es gibt 26 Arten von Großbuchstaben. Ist es also nicht tatsächlich eine Zahl von 26? Es hat jedoch andere Eigenschaften als die allgemeinen Zahlen.

Wenn Sie es irgendwie berühren, können Sie in eine unerwartete Falle geraten. Es ist einfach, aber ich habe über den Unterschied nachgedacht.

Vergleich der Spaltennummern für Dezimal-, 26- und A1-Notation

Vergleichen wir diese drei.

Dezimalzahl 26 Jahre alt A1 Notation
0000 AAAA ----
0001 AAAB ---A
0002 AAAC ---B
... ... ...
0025 AAAZ ---Y
0026 AABA ---Z
0027 AABB --AA
0028 AABC --AB
... ... ...

In allgemeinen Zahlen gibt es ein Symbol, das Null entspricht. Es ist "0" in Dezimalzahl und "A" in 26.

Andererseits gibt es in Spaltennummern in A1-Notation kein Symbol, das Null entspricht. In der obigen Tabelle wird stattdessen "-" verwendet, um es darzustellen. Wenn Sie "-" durch "A" ersetzen, ist die Handhabung schwierig, da die zweite Ziffer mit "A" beginnt, wenn sie aus zwei Ziffern besteht.

Bei 26-stelligen Zahlen ist die höchstwertige Ziffer niemals "A" (es sei denn, sie ist Null), das ist also kein Problem.

Daher enthält die Spaltennummer in der A1-Notation implizit die Information über die Anzahl der Ziffern, was wahrscheinlich eine wesentliche Bedeutung hat. Und durch die Menge dieser Informationen ist die Ausdrucksfähigkeit selbst bei der gleichen Anzahl von Ziffern höher als die 26 Basiszahlen.

Konvertierung von Spaltennummer in A1-Notation in Dezimalzahl

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

Wenn Sie die Funktion $ f $ auf diese Weise definieren, erfolgt die Konvertierung von 26-stelligen Zahlen in Dezimalzahlen

\Sigma_{i=0}^{D_{max}}{f(D[i])*26^i}

Kann ausgedrückt werden als. $ D $ ist jedoch eine 26-stellige Zahl, $ D [i] $ repräsentiert das i-te Ziffernzeichen von rechts und $ D {max} $ repräsentiert die maximale Ziffernzahl von $ D $. .. Nun, dies ist eine allgemeine Radix-Umrechnungsberechnung, nicht wahr?

Um eine Spaltennummer in A1-Notation in eine Dezimalzahl umzuwandeln, beginnt jede Ziffer bei 1 statt bei Null. Fügen Sie also +1 zum Wert von $ f $ hinzu.

\Sigma_{i=0}^{D_{max}}{(f(D[i])+1)*26^i}

Kann ausgedrückt werden als.

Es stellt sich heraus, dass bei Darstellung durch N Zeichen ein Unterschied in der Zahl besteht, die durch $ \ Sigma_ {i = 0} ^ {N-1} {26 ^ i} $ dargestellt werden kann.

Implementierungsbeispiel (Java)

Lassen Sie uns die Konvertierung von einer 26-stelligen Zahl und einer Spaltennummer im A1-Format in eine Dezimalzahl in Java implementieren.


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 wird angezeigt]");
        System.out.println(fromBase26Num("AAAA"));

        System.out.println("[1 wird angezeigt]");
        System.out.println(fromBase26Num("AAAB"));
        System.out.println(fromA1ColNum("A"));

        System.out.println("[27 wird angezeigt]");
        System.out.println(fromBase26Num("AABB"));
        System.out.println(fromA1ColNum("AA"));
    }
}

Ausführungsergebnis

[0 wird angezeigt]
0
[1 wird angezeigt]
1
1
[27 wird angezeigt]
27
27

OK

Zusammenfassung

Ich habe es hier nicht geschrieben, aber das Konvertieren einer Dezimalzahl in eine Spaltennummer im A1-Format ist noch umständlicher. https://github.com/ttk1/A1Util Ich weiß nicht, ob es gefragt ist, aber ich habe die Implementierung hier gestellt. (Bitte verzeihen Sie, dass der Variablenname und der Funktionsname nicht cool sind!)

Nachtrag

Das Konvertieren einer Dezimalzahl in eine Spaltennummer im A1-Format ist langwieriger.

Wie von @ saka1029 kommentiert, war es jedoch weniger problematisch als ich erwartet hatte.

Recommended Posts

A1-Notation und 26-stellige Nummer
Machen Sie die angegebene Anzahl von Sekunden zu Stunden, Minuten und Sekunden
Dateien lesen und schreiben
Dateien schreiben und lesen
Unterschied zwischen ps a und ps -a
Zufälliger Samen in TensorFlow und Numpy fixiert Etwas anders
Python a + = b und a = a + b sind unterschiedlich
[Python] Woche 1-3: Nummerntyp und Operation
Es ist eine Primzahl ... Zähle die Primzahlen ...
Pseudozufallszahlengenerierung und Zufallsstichprobe
a () und a .__ call__ () sind nicht gleichwertig
Erstellen Sie eine 1-MByte-Zufallszahlendatei
[Python] gibt A [oder / und] B zurück
C> Geben Sie eine Zahl ein> fgets () / sscanf ()
Erstellen Sie eine Korrespondenztabelle zwischen der EC-Nummer und dem Uniprot-Eintrag aus enzym.dat