JS實現大整數乘法(性能優化、正負整數)


本方法的思路為:

  一:檢查了輸入的合法性(非空,無非法字符)

  二:檢查輸入是否可以進行簡單計算(一個數為 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>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM