Last active
December 6, 2018 09:33
-
-
Save danbrianwhite/be7709cc5e1ba23d7c69 to your computer and use it in GitHub Desktop.
JavaScript Factorial using strings for larger calculations. (Can get quite slow)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var add = function(strNumOne, strNumTwo) | |
{ | |
var first; | |
var second; | |
var tempNumber = new Array(); | |
if(strNumOne.length >= strNumTwo.length) | |
{ | |
first = strNumOne; | |
second = strNumTwo; | |
} | |
else | |
{ | |
first = strNumTwo; | |
second = strNumOne; | |
} | |
var count = 0; | |
var difference = first.length - second.length; | |
var carryOver = 0; | |
for (var i = second.length - 1; i >= 0; i--) | |
{ | |
var temp = parseInt(second[i]) + parseInt(first[i+difference]) + carryOver; | |
if (temp >= 10) | |
{ | |
temp = temp - 10; | |
carryOver = 1; | |
} | |
else | |
{ | |
carryOver = 0; | |
} | |
tempNumber[count] = temp; | |
count++; | |
}; | |
for (var i = difference; i > 0; i--) | |
{ | |
var temp = parseInt(first[i-1]) + carryOver; | |
if (temp >= 10) | |
{ | |
temp = temp - 10; | |
carryOver = 1; | |
} | |
else | |
{ | |
carryOver = 0; | |
} | |
tempNumber[count] = temp; | |
count++; | |
}; | |
if (difference === 0 && carryOver != 0) | |
{ | |
tempNumber[count] = carryOver; | |
} | |
var finalNumber = new Array(); | |
for (var i = tempNumber.length - 1; i >= 0; i--) | |
{ | |
finalNumber += String(tempNumber[i]); | |
}; | |
return finalNumber; | |
} | |
var multiply = function(strNumOne, strNumTwo) | |
{ | |
var first; | |
var second; | |
var tempNumber = new Array(); | |
if(strNumOne.length >= strNumTwo.length) | |
{ | |
first = strNumOne; | |
second = strNumTwo; | |
} | |
else | |
{ | |
first = strNumTwo; | |
second = strNumOne; | |
} | |
var difference = first.length - second.length; | |
var tempNumberArray = ['0']; | |
var countZeros = 0; | |
for (var i = second.length - 1; i >= 0; i--) | |
{ | |
var count = countZeros; | |
for (var j = first.length - 1; j >= 0; j--) | |
{ | |
var temp = parseInt(second[i]) * parseInt(first[j]); | |
for (var k = 0; k < count; k++) | |
{ | |
temp += '0'; | |
}; | |
tempNumberArray.push(temp); | |
count++; | |
}; | |
countZeros++; | |
}; | |
var finalNumber = "0"; | |
for (var i = tempNumberArray.length - 1; i >= 0; i--) { | |
finalNumber = (add)(String(finalNumber), String(tempNumberArray[i])); | |
}; | |
return finalNumber; | |
} | |
var factorial = function(number) | |
{ | |
var factorialNumber = 1; | |
function factorialMultiply(currentMultiply, currentNumber) | |
{ | |
if(currentMultiply === '0') | |
{ | |
currentMultiply = 1; | |
} | |
return (multiply)(String(currentMultiply), String(currentNumber)) | |
} | |
for (var i = number; i >= 0; i--) { | |
factorialNumber = (factorialMultiply)(String(i), String(factorialNumber)); | |
} | |
return factorialNumber; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment