2

尽管这个问题在 StackOverflow 上已经有部分答案,但这些答案与标题或标签中具有过程/概念正确名称(双射 (base-k) numeration )的问题无关。我预计许多答案本质上将是与那些现有答案的链接。

如何在 PHP 中从 A 到 Z 列出,然后到 AA、AB、AC 等,部分回答了这个问题

双射 base-26 计数可用于计算许多电子表格程序中使用的方案中的列 ID,例如 LibreOffice Calc、Lotus-123、VisiCalc(我认为)、ProCalc 3D等。

以下是一种解决方案的 R伪代码(我还没有包含依赖项的“原始”R 代码)。返回是一个整数向量(little endian),其元素在概念上映射到用于表示双射计数的任意符号:

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"
4

1 回答 1

1

我不知道 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();
}
于 2020-03-18T08:14:35.703 回答