转换进制 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 进制 的数字 |