Skip to content

Instantly share code, notes, and snippets.

@hectorguo
Last active August 30, 2022 03:07
Show Gist options
  • Save hectorguo/7090ddae2c9f2329ecb1b269c5a3442d to your computer and use it in GitHub Desktop.
Save hectorguo/7090ddae2c9f2329ecb1b269c5a3442d to your computer and use it in GitHub Desktop.
print out big number in javascript (length > 22)
/**
* var big1 = new BigNum('234234234234234');
* var big2 = new BigNum('234234234234234');
* big1.multiplyBy(big2).toString(); // will output "54865676487297999188377566756" instead of 5.4865676487298e+28
*/
var BigNum = function(num) {
if (typeof num === 'string') {
this.parts = [];
while (num.length) {
this.parts.push(parseInt(num.slice(-5),10));
num = num.substring(0,num.length-5)
}
} else {
this.parts = num;
}
}
BigNum.prototype.multiplyBy = function(bigNum) {
var newParts = [];
for (var i = 0, l1 = this.parts.length; i < l1; ++i) {
for (var j = 0, l2 = bigNum.parts.length; j < l2; ++j) {
var newPartIndex = i + j;
newParts[newPartIndex] = this.parts[i] * bigNum.parts[j] + (newParts[newPartIndex] || 0);
}
}
this._fixOverflows(newParts);
return new BigNum(newParts);
};
BigNum.prototype.add = function(bigNum) {
var newParts = [];
var length = Math.max(this.parts.length, bigNum.parts.length);
for (var i = 0; i < length; ++i) {
newParts[i] = (this.parts[i] || 0) + (bigNum.parts[i] || 0);
}
this._fixOverflows(newParts);
return new BigNum(newParts);
}
BigNum.prototype._fixOverflows = function(parts) {
for (var k = 0; k < parts.length; ++k) {
var currentPart = parts[k].toString();
if (currentPart.length > 5) {
var overflowLength = currentPart.length - 5;
var overflow = parseInt(currentPart.substr(0, overflowLength), 10);
parts[k] = parseInt(currentPart.substr(overflowLength), 10)
parts[k + 1] = overflow + (parts[k + 1] || 0);
}
}
}
BigNum.prototype.toString = function() {
var fullNumber = this.parts.map(function(num) {
num = num.toString();
paddingAmount = 5 - num.length;
for (var i = 0; i < paddingAmount; ++i) {
num = '0' + num;
}
return num
}).reverse().join('');
while( fullNumber.charAt(0) === '0' && fullNumber.length !== 1) {
fullNumber = fullNumber.substring(1);
}
return fullNumber;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment