Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * 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;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement