尽管这个问题在StackOverflow上已经有了部分答案,但这些答案与标题或标签中具有过程/概念的正确名称(双射(base-k(数字(的问题无关。我预计许多答案基本上都是与这些现有答案的链接。
这个问题在如何在PHP中从A到Z列出,然后到AA,AB,AC等中得到了部分回答
。双射基数 26 计数可用于计算许多电子表格程序中使用的方案中的列 ID,例如 LibreOffice Calc、Lotus-123、VisiCalc(我认为(、ProCalc 3D 等。
下面是一个解决方案的 R 伪代码(我尚未包含依赖项的"原始"R 代码(。返回是一个整数向量(小端序(,其元素在概念上映射到用于表示双射数字的任意符号:
bijective.numeral <- function(n, symbols=26L) {
if (!is_among.contiguous.integers(n)) return (NULL)
if (n < 0) return(iNA)
if (n == 0) return(integer())
intermediate <- pseudo.log(n, symbols) %|% integer
# PREALLOCATE A VECTOR LONG ENOUGH FOR THE RESULT
m <- 0L
while (n) {
m <- 1L + m
intermediate[[m]] <- 1:symbols %[mod% n
n <- n %|% pred %/% symbols }
intermediate[1:m] }
LETTERS[16384 %|% bijective.numeral] %|% rev %|% `%//%`
# [1] "XFD"
R,但如果它有帮助,这是我刚刚用javascript编写的双射计数的实现:
function bijectiveString(m, k) {
if (m == 0) {
return [];
}
let string = [];
function f(x) {
return Math.ceil(x) - 1;
}
let qn = f(m / k); // q0
string.push(m - qn * k); // a0
while (qn != 0) {
let qnInc = f(qn / k);
let anInc = qn - qnInc*k;
string.push(anInc);
qn = qnInc;
}
return string.reverse();
}