Эта версия JavaScript показывает, что по своей сути это преобразование в базу 26:
function colName(x)
{
x = (parseInt("ooooooop0", 26) + x).toString(26);
return x.slice(x.indexOf('p') + 1).replace(/./g, function(c)
{
c = c.charCodeAt(0);
return String.fromCharCode(c < 64 ? c + 17 : c - 22);
});
}
Бит .toString(26)
показывает, что Джоэл Коухорн не прав: это простое базовое преобразование.
(Примечание: у меня есть более прямолинейная реализация, основанная на ответе Даны в работе. Она менее тяжелая, работает для больших чисел, хотя это не повлияет на меня, но также не показывает математический принцип так ясно.)
P.S. Вот функция, оцененная в важных точках:
0 A
1 B
9 J
10 K
24 Y
25 Z
26 AA
27 AB
700 ZY
701 ZZ
702 AAA
703 AAB
18276 ZZY
18277 ZZZ
18278 AAAA
18279 AAAB
475252 ZZZY
475253 ZZZZ
475254 AAAAA
475255 AAAAB
12356628 ZZZZY
12356629 ZZZZZ
12356630 AAAAAA
12356631 AAAAAB
321272404 ZZZZZY
321272405 ZZZZZZ
321272406 AAAAAAA
321272407 AAAAAAB
8353082580 ZZZZZZY
8353082581 ZZZZZZZ
8353082582 AAAAAAAA
8353082583 AAAAAAAB