• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

N進数変換-excelの列表現

date: 2021-05-02 excerpt: excelの列表現を再現する

tag: algorithmmathintegerexcel


excelの列表現を再現する

概要

  • Excelの列はA, B, ..., Z, AA, AB, ...のような文字の組み合わせで表現される
  • 通常のN進数の表現とは異なり、数字部分がなく、0が基数ではない
    • N進数変換にちょっとした調整が必要
      • 桁上りのときに基数に合わせる操作を入れる

具体例

数値->Excelの列表現

from string import ascii_uppercase

m = {}
for i in range(len(ascii_uppercase)):
    m[i] = ascii_uppercase[i]

def decimal_to_base_str(x: int, base: int) -> list:
    to_str = lambda a: m[a]
    if x//base != 0:
        # -1することで調整している
        return decimal_to_base_str(x//base-1, base) + [to_str(x%base)]
    return [to_str(x%base)]

assert decimal_to_base_str(0, 26) == ["A"]
assert decimal_to_base_str(25, 26) == ["Z"]
assert decimal_to_base_str(26, 26) == ["A", "A"]
assert decimal_to_base_str(27, 26) == ["A", "B"]
assert decimal_to_base_str(28, 26) == ["A", "C"]

Excelの列表現->数値

from typing import *
from string import ascii_uppercase

m = {}
for i in range(len(ascii_uppercase)):
    m[ascii_uppercase[i]] = i+1

def anybase_to_decimal(x: "List[str]", k: int):
    '''
    x: n進数数字
    k: 変換元とする進数
    '''
    dec = 0
    for idx, ch in enumerate(reversed(x)):
        dec += m[ch] * (k**idx)
    return dec

assert(anybase_to_decimal(list("A"), 26) == 1)
assert(anybase_to_decimal(list("B"), 26) == 2)
assert(anybase_to_decimal(list("AA"), 26) == 27)
assert(anybase_to_decimal(list("ZY"), 26) == 701)

参考

  • 168. Excel Sheet Column Title/LeetCode
  • 171. Excel Sheet Column Number/LeetCode


algorithmmathintegerexcel Share Tweet