Как преобразовать число в буквенную 26-ричную систему счисления
Есть задача конвертировать форматы столбцов подобных столбцам таблицы Excel, где каждый столбец обозначается буквой английского алфавита (например 1 столбец буквой A, второй B) и их сочетаниями (например 27 столбец будет обозначен AA, 28 - AB, 29 - AC и т.д.). Таким образом каждый раз когда текущей алфавитной таблицы становится мало, добавляется еще один буквенный "разряд" как в системах счисления, чтобы узнать номер клетки к номеру столбца просто добавляется числовое значение строки (например AA55, T62, B12).
Есть еще один формат в задаче, где координаты клетки задаются исключительно числами в формате R<номер строки>C<номер столбца>, так номер из первого формата BC23 во втором будет выглядеть как R23C55, задача - написать двусторонний преобразователь форматов, где вводится количество координат, а затем сами координаты клеток в любом формате. Успешно написав конвертацию из буквенного формата в числовой, никак не могу сделать обратное, вот лучше что у меня получилось:
n = int(input())
f = []
for _ in range(n):
a = input()
if a[0]=='R' and 'C' in a and 47< ord(a[1]) <58:
b = list(map(int, a[1:].split('C')))
x=''
s = 1
sums = 26
while b[1]>sums:
s+=1
sums+=pow(26, s)
y = 0
for i in range(s-1, -1, -1):
y = b[1]//pow(26, i)
if y>26 or b[1]==0:
y=26
b[1]-=y*pow(26, i)
x+=chr(y+64)
f.append(x+str(b[0]))
else:
i = 0
x = 0
string = ''
while 64<ord(a[i])<91:
string+=a[i]
i+=1
string = string[::-1]
for j in range(len(string)):
x+=(ord(string[j])-64)*pow(26, j)
f.append(f'R{a[i:]}C{x}')
print(*f, sep='\n')
При написании алгоритма разглядел параллель с преобразованием в систему счисления, но отличием является отсутствие в системе нуля, из за чего полное копирование алгоритма преобразования систем ведет к началу с буквы 'B' а не 'A' (например после Z вместо AA, выдает BA).
Работает на многих тестах, но например координаты R23C728 преобразует в ABZ23, а должен в AAZ23, прошу помощи с программой или поиском алгоритма проще.
Входные данные:
2
R23C55
BC23
Выходные данные:
BC23
R23C55
Ответы (1 шт):
Например так:
def conv(num):
s = chr((num - 1) % 26 + 65)
if num > 26:
s = conv((num - 1)//26) + s
return s
print(conv(728)) # AAZ