轉換進制 Convert Base
轉換進制 Convert Base
Categories:
轉換數字
及 目標 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 進制 的數字 |