Odkryłem błąd w moim pierwszym poście, więc postanowiłem usiąść i wykonać matematykę. Odkryłem, że system liczbowy używany do identyfikacji kolumn Excela nie jest systemem podstawowym 26, jak napisała inna osoba. Zastanów się, co następuje w podstawie 10. Możesz to również zrobić z literami alfabetu.
Spacja: ......................... S1, S2, S3: S1, S2, S3
............ ....................... 0, 00, 000: .. A, AA, AAA
............. ....................... 1, 01, 001: .. B, AB, AAB
.............. ......................…,…,…: ..…,…,…
............... ..................... 9, 99, 999: .. Z, ZZ, ZZZ
Suma stanów w przestrzeni: 10, 100, 1000: 26, 676, 17576
Ogółem państwa: ........... 1110 ............... 18278
Kolumny z liczbami Excela w poszczególnych przestrzeniach alfabetycznych przy użyciu podstawy 26. Widać, że ogólnie postęp przestrzeni stanów jest a, a ^ 2, a ^ 3,… dla pewnej podstawy a, a całkowita liczba stanów to ^ 2 + a ^ 3 +…
Załóżmy, że chcesz znaleźć całkowitą liczbę stanów A w pierwszych N odstępach. Wzór na to: A = (a) (a ^ N - 1) / (a-1). Jest to ważne, ponieważ musimy znaleźć przestrzeń N, która odpowiada naszemu indeksowi K. Jeśli chcę dowiedzieć się, gdzie K leży w systemie liczbowym, muszę zastąpić A literą K i rozwiązać dla N. Rozwiązanie to N = log { base a} (A (a-1) / a +1). Jeśli użyję przykładu a = 10 i K = 192, wiem, że N = 2.23804…. To mówi mi, że K leży na początku trzeciej przestrzeni, ponieważ jest nieco większa niż dwa.
Następnym krokiem jest ustalenie, jak daleko jesteśmy w obecnej przestrzeni. Aby to znaleźć, odejmij od K A wygenerowanego za pomocą podłogi N. W tym przykładzie podłoga N wynosi dwa. Tak więc A = (10) (10 ^ 2 - 1) / (10-1) = 110, jak można się spodziewać po połączeniu stanów dwóch pierwszych spacji. Należy to odjąć od K, ponieważ te pierwsze 110 stanów zostałoby już uwzględnione w pierwszych dwóch spacjach. Pozostaje nam 82 państwa. Tak więc w tym systemie liczb reprezentacja 192 w bazie 10 to 082.
Kod C # przy użyciu podstawowego indeksu wynosi zero
private string ExcelColumnIndexToName(int Index)
{
string range = string.Empty;
if (Index < 0 ) return range;
int a = 26;
int x = (int)Math.Floor(Math.Log((Index) * (a - 1) / a + 1, a));
Index -= (int)(Math.Pow(a, x) - 1) * a / (a - 1);
for (int i = x+1; Index + i > 0; i--)
{
range = ((char)(65 + Index % a)).ToString() + range;
Index /= a;
}
return range;
}
// Stary post
Rozwiązanie zerowe w języku C #.
private string ExcelColumnIndexToName(int Index)
{
string range = "";
if (Index < 0 ) return range;
for(int i=1;Index + i > 0;i=0)
{
range = ((char)(65 + Index % 26)).ToString() + range;
Index /= 26;
}
if (range.Length > 1) range = ((char)((int)range[0] - 1)).ToString() + range.Substring(1);
return range;
}