以下是一些替代方案:
1) 编码 让 b 成为进制基数,这里 b = 26。那么有 b^k 种附录,每个附录都有 k 个字母,
所以对于特定编号为 x 的附录,如果存在最小的整数 n 满足 b + b^2 + ... + b^n >= x,
则该附录包含 n 个字母。此不等式的左侧为一个等比数列,因此有一个闭合形式的解。
将左侧替换为该表达式并解决所得到的方程以获得 code 下方的 n 公式。然后,从所有满足 k < n 的数字中减去所有 b^k 项,并使用 APL-like encode
函数(在 此处 和网络上的其他地方找到)。encode
进行基数转换,给出一个基数为 base
中的数字向量 digits
。 最后,将每个数字加 1 并将其用作查找到 LETTERS
中。
app2 <- function(number, base = 26) {
n <- ceiling(log((1/(1 - base) - 1 - number) * (1 - base), base = base)) - 1
digits <- encode(number - sum(base^seq(0, n-1)), rep(base, n))
paste(LETTERS[digits + 1], collapse = "")
}
sapply(1:29, app2)
提供:
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O"
[16] "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z" "AA" "AB" "AC"
另一个要尝试的测试是:
sapply(1:60, app2, base = 3)
2) 递归解法 这是一种递归解法。它计算附录编号的最后一个字母,然后将其删除并递归计算其左侧的部分。
app2r <- function(number, base = 26, suffix = "") {
number1 <- number - 1
last_digit <- number1 %% base
rest <- number1 %/% base
suffix <- paste0(LETTERS[last_digit + 1], suffix)
if (rest > 0) Recall(rest, base, suffix) else suffix
}
identical(sapply(1:29, app2r), sapply(1:29, app2))
identical(sapply(1:60, app2r, base = 3), sapply(1:60, app2, base = 3))