轉換進制 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 進制 的數字

參考資料