要約
- 「あ、こいつネットでコピーしてきたな。しかも間違ってるじゃんwww」みたいになったら嫌だなと思ったので気が済むまで考えました。
- テストの書き方がよく分かりません。
test.py
def number_to_excelABC(n):
excelABC = ""
while n > 0:
n,a =divmod(n-1,26)
excelABC = chr(a+65) + excelABC
return excelABC
def test_numbert_to_excelABC_function(func):
test_list = [1,26,27,52,53,676,677,702,703,1000]
answer_list = ["A","Z","AA","AZ","BA","YZ","ZA","ZZ","AAA","ALL"]
compare_list = [func(t) == ans for t,ans in zip(test_list,answer_list)]
if all(compare_list):
print("pass the test")
else:
print("fail the test")
print(test_list)
print(answer_list)
print(compare_list)
test_numbert_to_excelABC_function(number_to_excelABC)
excel10進数を考える
[1, 2, 3, 4, 5, 6, 7, 8, 9, X, 11, 12, ……, 19, 1X, 21, 22]
みたいになっている。数字の0がない代わりに10個目の数字で10を表すXが存在する。
他にも、100と101は「9X,X1」になる。110が「XX」で111が「111」になる。
つまり。。。よくわかんないってこと
気を付けなければいけないポイント
普通のn進変換とは繰り上がるタイミングが異なる
Excel26進数では26はZ、27になって初めてAAとなる
52,53も普通の26進数では20,21と表すところだが、AZ=26+26とBA=52+1のような表し方になっている(数字のゼロが無いので52+0=B0は表現できない)
商が増えるタイミングをずらすために、26で割り算をする前に1を引く。1ずらした分は文字列に変換する際に調整する
具体例
1373→AZUの変換をする
答えから考えるとA=1, Z=26, U=21なので
1373 = 1×26×26 + 26×26 + 21と分解できればOK
- 1を引いて26で割る→52余り20
- 21番目の文字Uが一桁目となる
(以降はn=0までループ) - 52-1=51は1余り25
- 二桁目は26文字目のZとなる
(ループ) - 1-1=0は0余り0
- 1番目の文字Aが3桁目となる
商が0となったら終了
謝辞
数字のゼロを考えてくれたインドの何某さん。ありがとうございます