转换进制 Convert Base

转换进制 Convert Base

转换数字目标 base 必须大于 0

TypeScript

function convertToBaseK(sourceNumber: number, targetBase: number): string {
    // 如果来源数字是 0 直接回传 0
    if (sourceNumber == 0) {
        return '0';
    }
    if (sourceNumber <= 0 ) {
        throw Error('source number must bigger than 0');
    }
    if (targetBase <= 0 || targetBase >=10) {
        throw Error('target base must between 1~10');
    }

    // 目标数字
    let targetBaseNumber = "";
    while (sourceNumber != 0) {
        // 馀数
        let remainderNumber = sourceNumber % targetBase;
        // 下一进位数字
        sourceNumber = Math.floor(sourceNumber / targetBase);
        // 转换目标 base 数字
        targetBaseNumber = String(remainderNumber) + targetBaseNumber;
    }

    return targetBaseNumber;
};

使用 Array.push() 纪录答案再反转

function convertToBaseK(sourceNumber: number, targetBase: number): string {
    // 如果来源数字是 0 直接回传 0
    if (sourceNumber == 0) {
        return '0';
    }
    if (sourceNumber < 0 ) {
        throw Error('source number must bigger than 0');
    }
    if (targetBase <= 0 || targetBase >=10) {
        throw Error('target base must between 1~10');
    }

    let targetBaseNumberArray = [];
    while (sourceNumber != 0) {
        // 馀数
        let remainderNumber = sourceNumber % targetBase;
        // 下一进位计算数字
        sourceNumber = Math.floor(sourceNumber / targetBase);
        // 转换目标 base 数字
        targetBaseNumberArray.push(remainderNumber);
    }

    // 目标数字转换
    // 因为馀数会从个位数加上去,所以 base 会由小到大放入,为了显示正确的由大到小,必须将阵列反转
    let targetBaseNumber = targetBaseNumberArray.reverse().join('');

    return targetBaseNumber;
};

目标 base 必须大于 0,转换数字 可以是正数及负数

正负符号只影响最后结果的正负值,但整个的计算馀数剩馀数字的运算逻辑皆相同

所以计算之前先将符号额外取出,最后运算结束再将符号加上去

TypeScript

使用 Array.push() 纪录答案再反转

function convertToBaseK(sourceNumber: number, targetBase: number): string {
    if (targetBase <= 0 || targetBase >=10) {
        throw Error('target base must between 1~10');
    }

    // 如果来源数字是 0 直接回传 0
    if (sourceNumber == 0) {
        return '0';
    }

    // 数字符号
    let numberSign = '';
    if (sourceNumber < 0) {
        numberSign = '-';
    }

    // 计算正整数
    sourceNumber = Math.abs(sourceNumber);

    // 转换目标数字阵列
    let targetBaseNumberArray = [];
    while (sourceNumber != 0) {
        // 馀数
        let remainderNumber = sourceNumber % targetBase;
        // 下一进位计算数字
        sourceNumber = Math.floor(sourceNumber / targetBase);
        // 转换目标 base 数字
        targetBaseNumberArray.push(remainderNumber);
    }

    // 加入数字正负符号
    targetBaseNumberArray.push(numberSign);
    // 目标数字转换并 join 成答案
    // 因为馀数会从个位数加上去,所以 base 会由小到大放入,为了显示正确的由大到小,必须将阵列反转
    let targetBaseNumber = targetBaseNumberArray.reverse().join('');

    return targetBaseNumber;
};

使用 Array.unshift() 纪录答案

function convertToBaseK(sourceNumber: number, targetBase: number): string {
    if (targetBase <= 0 || targetBase >=10) {
        throw Error('target base must between 1~10');
    }

    // 如果来源数字是 0 直接回传 0
    if (sourceNumber == 0) {
        return '0';
    }

    // 转换目标数字阵列
    let targetBaseNumberArray: any = [];

    // 数字符号
    let numberSign = '';
    if (sourceNumber < 0) {
        numberSign = '-';
    }

    // 计算正整数
    sourceNumber = Math.abs(sourceNumber);

    while (sourceNumber != 0) {
        // 馀数
        let remainderNumber = sourceNumber % targetBase;
        // 下一进位计算数字
        sourceNumber = Math.floor(sourceNumber / targetBase);
        // 转换目标 base 数字加到前方
        targetBaseNumberArray.unshift(remainderNumber);
    }

    // 最前方加入数字正负符号
    targetBaseNumberArray.unshift(numberSign);
    // 目标数字转换并 join 成答案
    let targetBaseNumber = targetBaseNumberArray.join('');

    return targetBaseNumber;
};

10 进制转换成 16 进制

TypeScript

function toHex(originalNumber: number): string {
    // 十进制与 16 进制索引对应
    let decimalHexMap = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];

    if (originalNumber == 0) {
        // 若传入的数字是 0,则直接回传
        return '0';
    }
    let hexNumber = '';
    while (originalNumber != 0) {
        // 与 15 做 & 运算(取馀数) == % 16
        let remainderNumber = originalNumber & 15;
        // 取得馀数的 Map 索引对应数字
        hexNumber = decimalHexMap[remainderNumber] + hexNumber;
        // 除以 16
        originalNumber = (originalNumber >>> 4);
    }

    return hexNumber;
};

10 进制转换成 8 进制

TypeScript

function toBase8(originalNumber: number): string {
    // 十进制与 8 进制索引对应
    let decimalBase8Map = ['0','1','2','3','4','5','6','7'];

    if (originalNumber == 0) {
        // 若传入的数字是 0,则直接回传
        return '0';
    }
    let base8Number = '';
    while (originalNumber != 0) {
        // 与 7 做 & 运算(取馀数) == % 8
        let remainderNumber = originalNumber & 7;
        // 取得馀数的 Map 索引对应数字
        base8Number = decimalBase8Map[remainderNumber] + base8Number;
        // 除以 8
        originalNumber = (originalNumber >>> 3);
    }

    return base8Number;
};

10 进制转换成 4 进制

function toBase4(originalNumber: number): string {
    // 十进制与 4 进制索引对应
    let decimalBase4Map = ['0','1','2','3'];

    if (originalNumber == 0) {
        // 若传入的数字是 0,则直接回传
        return '0';
    }
    let base4Number = '';
    while (originalNumber != 0) {
        // 与 3 做 & 运算(取馀数) == % 4
        let remainderNumber = originalNumber & 3;
        // 取得馀数的 Map 索引对应数字
        base4Number = decimalBase4Map[remainderNumber] + base4Number;
        // 除以 8
        originalNumber = (originalNumber >>> 2);
    }

    return base4Number;
};

Leetcode 题目

题目 说明
405. Convert a Number to Hexadecimal 传入一个整数,回传 16 进制的数字
504. Base 7 给予一个整数 num,转换成 7 进制的数字
1017. Convert to Base -2 传入一个整数 n,将它转换成 -2 进制 的数字

参考资料