现在我想根据数字转换为英文字母:比如 A->1,B->2,……AA->27,AB->28。
我的思路本来是想维护一个数组,然后根据辗转相除法,然后生成对应的下标,但是有问题:
function numToLetter(originNum = 53) {
let letter = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
let num = originNum; // 随意输入一个数字
let numArr = []; // 得到num对应的字母下标
// 辗转相除,然后取余数
while (num > 0) {
numArr.push(num % 26);
num = Math.floor(num / 26);
}
console.log('**********************************')
// 输出对应数字的字母下标
console.log(`${originNum}对应的字母下标为`, numArr.reverse());
let str = ''; // 数字对应的字符串
numArr.forEach(v => {
str += letter[v-1]
})
console.log('这个字符串为:', str)
}
numToLetter(53)
numToLetter(52)
53 = 26^1 * 2 + 26^0 * 1
52 = 26^1 * 2 + 26^0 * 1
26 进制是这样算的,但是转换为下标的话,这样写有问题,不知道如何优化,或者别的思路求数字转字母
首先,这个“26 进制”不是标准 26 进制,是双射 26 进制(Bijective positional notation [wiki])
所以,直接取余才会遇到没法处理余数是
0
的情况。用我们更为熟悉的十进制来类比一下
在双射十进制中,假定使用
1-9
和A
这 10 个数字。10
->(1, 0)
->A
11
->(1, 1)
->11
20
->(2, 0)
->1A
100
->(1, 0, 0)
->9A
110
->(1, 1, 0)
->AA
111
->(1, 1, 1)
->111
那么,遇到余数是
0
怎么办?以双射十进制下表达100
为例(手算过程,伪代码)现在我们可以改进原来的代码:
结果: