题目
[编程题]进制转换——来自牛客的华为研发工程师编程题,难度:🌟🌟
对于给定的十六进制数,输出其对应的十进制表示。
在本题中,十六进制数的格式为:0x 开头,后跟若干个十六进制数字(0-9 和 A-F )。其中,A-F 依次代表10−15。
输入描述:
在一行上输入一个十六进制数 s ,代表待转换的十六进制数。
保证 s 转化得到的十进制数 x 的范围为 1≦x≦2^31 −1。
输出描述:
在一行上输出一个整数,代表 s 对应的十进制数。
示例1
输入
0xFA93
输出
64147
说明
回忆十六进制转化为十进制的方法:从右往左,将第 i 位乘以 16^i,然后求和。
在这个样例中,0xFA93 的第 0 位是 3 ,第 1 位是 9 ,第 2 位是 A ,第 3 位是 F ,因此 0xFA93 =3×160+9×161+10×162+15×163
=64147。
解题
逐个累加解法
因为总共就16个,所以我直接写了一个十进制个位数字符与十进制个位数整数的对照表。
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', function (line: string) {
const input16 = line.split('0x')[1];
const map16to10 = {
'0': 0,
'1': 1,
'2': 2,
'3': 3,
'4': 4,
'5': 5,
'6': 6,
'7': 7,
'8': 8,
'9': 9,
'A': 10,
'B': 11,
'C': 12,
'D': 13,
'E': 14,
'F': 15,
};
let resultFor10 = 0;
for(let i = input16.length - 1; i >= 0; i--) {
const key = input16[i];
const number10 = map16to10[key];
resultFor10 += number10 * Math.pow(16, input16.length - i - 1);
}
console.log(resultFor10);
});
遇到的问题:
- 16进制转10进制时,16进制数的倒数第1位将乘以16的0次方,倒数第2位将乘以16的1次方,倒数第i位将乘以16的
i-1
次方。
假设该16进制数共有len位,则其中索引为idx的那一位将乘以16的len-idx-1
次方。 - 16的n次方用js怎么写?
Math.pow(16,n)
- 16进制转10进制时,16进制的位是乘以16的n次方,不是乘以2的n次方。
- 若不确定字符串前两位的内容,如何去除前两位呢?
str.slice(2)
一步到位解法
parseInt(n,16)直接就能算出一段16进制字符串对应的10进制数。
console.log(parseInt('0xFA93',16));