本方法的思路為:
一:檢查了輸入的合法性(非空,無非法字符)
二:檢查輸入是否可以進行簡單計算(一個數為 0,1,+1,-1)
三:去掉輸入最前面可能有的正負符號,並判斷輸出的正負
四:將輸入的值分成4位一截(分的長度太短,性能太差,長度太長,精度容易降低)
五:遍歷相乘得到最終數組(這里用了遞歸)
六:遍歷最終數組,拼接最終的數(不建議用join,因為數組中的元素可能小於四位,拼接時會丟失0)
七:將正負符號與最終的數拼接輸出
代碼如下:
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> var num1 = ""; var num2 = ""; var finallyArr; /* * 有兩個用字符表示的非常大的大整數,算出他們的乘積,也是用字符串表示,不能用系統自帶的大整數類型。 * 輸入例子72106547548473106236 982161082972751393 * 輸出例子70820244829634538040848656466105986748 70820244829634538040848656466105986748 */ function getResult(){ finallyArr = new Array(); num1 = document.getElementById("num1").value; num2 = document.getElementById("num2").value; if(!checkNum(num1)){ alert("輸入:num1 不合法!"); return; } if(!checkNum(num2)){ alert("輸入:num2 不合法!"); return; } //特殊情況的簡單算法 if(doSimpleWay()){ return; } //獲取最終值的正負符號 var symbol = initSymbol(); //將輸入的值分成4位一小截的數組 var numArr1 = getNumArr(num1,new Array()); var numArr2 = getNumArr(num2,new Array()); //遍歷相乘相加得到最終的數組 for(var i = 0; i < numArr1.length; i++){ for(var j = 0; j < numArr2.length; j++){ updateFinallyArr(i + j , numArr1[i] * numArr2[j]); } } //倒序遍歷數組獲取最終結果 var resultStr = finallyArr.pop(); for(var i = finallyArr.length; i >= 0; i--){ if(finallyArr[i] >= 1000){ resultStr += "" + finallyArr[i]; }else if(finallyArr[i] < 1000){ resultStr += "0" + finallyArr[i]; }else if(finallyArr[i] < 100){ resultStr += "00" + finallyArr[i]; }else if(finallyArr[i] < 10){ resultStr += "000" + finallyArr[i]; }else if(finallyArr[i] == 0){ resultStr += "0000"; } } document.getElementById("RESULT").innerText = symbol + resultStr; } /** * 根據數值以及數值的位置更新最終的數組 */ function updateFinallyArr(i , num){ var old = finallyArr[i]; if(old){ num = num + old; } if(num > 9999){ finallyArr[i] = num % 10000; updateFinallyArr(i + 1 , Math.floor(num/10000) ); }else{ finallyArr[i] = num; } } /** * 處理輸入字符串的正負號,並判斷最終值的正負號 */ function initSymbol(){ if(num1.substring(0,1) == "-"){ num1 = num1.substring(1,num1.length); if(num2.substring(0,1) == "-"){ num2 = num2.substring(1,num2.length); }else if(num2.substring(0,1) == "+"){ num2 = num2.substring(1,num2.length); return "-"; }else{ return "-"; } }else if(num1.substring(0,1) == "+"){ num1 = num1.substring(1,num1.length); if(num2.substring(0,1) == "-"){ num2 = num2.substring(1,num2.length); return "-"; }else if(num2.substring(0,1) == "+"){ num2 = num2.substring(1,num2.length); } } return ""; } /** * 特殊情況的簡單算法 */ function doSimpleWay(){ if(num1 == "0" || num2 == "0"){ document.getElementById("RESULT").innerText = "0"; return true; }else if(num1 == "1" || num1 == "+1"){ document.getElementById("RESULT").innerText = num2; return true; }else if(num2 == "1" || num2 == "+1"){ document.getElementById("RESULT").innerText = num1; return true; }else if(num1 == "-1"){ if(num2.substring(0,1) == "-" ){ document.getElementById("RESULT").innerText = num2.substring(1,num2.length); }else if(num2.substring(0,1) == "+" ){ document.getElementById("RESULT").innerText = "-" + num2.substring(1,num2.length); }else{ document.getElementById("RESULT").innerText = "-" + num2; } return true; }else if(num2 == "-1"){ if(num1.substring(0,1) == "-" ){ document.getElementById("RESULT").innerText = num1.substring(1,num1.length); }else if(num1.substring(0,1) == "+" ){ document.getElementById("RESULT").innerText = "-" + num1.substring(1,num1.length); }else{ document.getElementById("RESULT").innerText = "-" + num1; } return true; } return false; } /** * 獲取4位一小截的數組 */ function getNumArr(num,arr){ var len = num.length; if(len > 4){ arr.push(num.substring(len-4,len) * 1); num = num.substring(0,len-4); return getNumArr(num,arr); }else{ arr.push(num * 1); return arr; } } /** * 檢查輸入數字的正確性,非空、無不合法字符 */ function checkNum(num){ if(!num){ return false; } var str = num.replace(/[0-9]/g,""); if(str == "" || (str == "-" && num.substring(0,1) =="-" && num.length > 1) || (str == "+" && num.substring(0,1) =="+" && num.length > 1) ){ if(num.length > 1000){ return false; } return true; }else{ return false; } } </script> </head> <body> num1:<input type="text" id="num1" name=""
value="7210654754847310623672106547548473106236721065475484731062367210654754847310623672106547548473106236" style="width:80%"></br> num2:<input type="text" id="num2" name=""
value="9821610829727513939821610829727513939821610829727513939821610829727513939821610829727513939821610829" style="width:80%"></br> <input type="button" id="num2" value="計算" onclick="getResult()"></br> <textarea id = "RESULT" rows="5" style="width:80%"></textarea> </body> </html>