function Stack() {
this.items = new Array();
Stack.prototype.push = function (element: unknown) {
this.items.push(element);
};
Stack.prototype.pop = function () {
return this.items.pop();
};
Stack.prototype.peek = function () {
return this.items[this.items.length - 1];
};
Stack.prototype.isEmpty = function () {
return this.items.length === 0;
};
Stack.prototype.size = function () {
return this.items.length;
};
Stack.prototype.clear = function () {
this.items = [];
};
Stack.prototype.toString = function () {
return this.items.join(',');
};
}
function dec2bin(decNumber: number) {
const binStack = new (Stack as any)();
while (decNumber > 0) {
binStack.push(decNumber % 2);
decNumber = decNumber >>> 1;
}
const binArr = [];
while (!binStack.isEmpty()) {
binArr.push(binStack.pop());
}
return binArr.join('');
}
console.log(dec2bin(10));
十进制转二进制就是将十进制数对2进行取模运算,将每一次运算得到的余数从最后一次开始倒序组合即为这个十进制数的二进制数,详细可以百度辗转相除法
十进制转2~36任意进制:
// 10进制转换2~36进制的数
function baseConverter(decNumber, base) {
const remStack = new Stack();
const digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' // 不同进制数商值对应的表达形式
let number = decNumber
let rem
let baseString = ''
if (!(base >= 2 && base <= 36)) {
return null
}
// 辗转相除法将每次的商压栈
while (number > 0) {
rem = Math.floor(number % base)
remStack.push(rem)
if (base === 2) {
number = number >>> 1
} else {
number = Math.floor(number / base)
}
}
// 按顺序弹栈
while (!remStack.isEmpty()) {
baseString += digits[remStack.pop()]
}
return baseString
}
思路: 利用栈的先进后出特性实现余数的倒序组合,将每一次对2取模的结果压入栈,每一次的商做为下一次的除数,只要除数>0则继续除下去,最后从栈顶将余数一个个弹栈组合起来.