华为研发工程师编程题——进制转换

题目

[编程题]进制转换——来自牛客的华为研发工程师编程题,难度:🌟🌟

对于给定的十六进制数,输出其对应的十进制表示。
在本题中,十六进制数的格式为: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);
});

遇到的问题:

  1. 16进制转10进制时,16进制数的倒数第1位将乘以16的0次方,倒数第2位将乘以16的1次方,倒数第i位将乘以16的 i-1 次方。
    假设该16进制数共有len位,则其中索引为idx的那一位将乘以16的 len-idx-1 次方。
  2. 16的n次方用js怎么写?
    Math.pow(16,n)
  3. 16进制转10进制时,16进制的位是乘以16的n次方,不是乘以2的n次方。
  4. 若不确定字符串前两位的内容,如何去除前两位呢?
    str.slice(2)
一步到位解法

parseInt(n,16)直接就能算出一段16进制字符串对应的10进制数。

console.log(parseInt('0xFA93',16));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值