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* 輸出例子7082024482963453804084865646610598674870820244829634538040848656466105986748*/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>

?

?

轉載于:https://www.cnblogs.com/ttjsndx/p/8549659.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453291.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453291.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453291.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言中- gt he,C語言中deta,fabs,lt;stdlib.hgt;,lt;stdio.hgt;分別是什么意思

fabs 編輯本段C語言數學函數:fabs 函數簡介  原型&#xff1a;在TC中原型是extern float fabs(float x);&#xff0c;在VC6.0中原型是double fabs( double x );。   用法&#xff1a;#include   功能&#xff1a;求浮點數x的絕對值   說明&#xff1a;計算|x|, 當x不為…

物理層

目的&#xff1a; 物理層要盡可能地屏蔽掉物理設備和傳輸媒體&#xff0c;通信手段的不同&#xff0c;使數據鏈路層感覺不到這些差異&#xff0c;只考慮完成本層的協議和服務。 給其服務用戶&#xff08;數據鏈路層&#xff09;在一條物理的傳輸媒體上傳送和接收比特流…

C語言中的二級指針(雙指針)

二級指針又叫雙指針。C語言中不存在引用&#xff0c;所以當你試圖改變一個指針的值的時候必須使用二級指針。C中可以使用引用類型來實現。 下面講解C中的二級指針的使用方法。 例如我們使用指針來交換兩個整型變量的值。 錯誤代碼如下&#xff1a; 一級指針 [cpp] view pla…

測試環境服務器硬盤塞滿問題排查

項目中出現的問題 某天下午測試環境服務器出現tab無法補全命令&#xff0c;給出的提示大概意思就是說,無可用空間無法創建臨時文件&#xff0c;不過這次跟上次出現的問題比較像&#xff0c;上次服務器出現的問題&#xff0c;因此樓主判斷可能是服務器數據盤被占滿&#xff0c;果…

alpine_glibc 構建sun jdk 8的docker鏡像

2019獨角獸企業重金招聘Python工程師標準>>> 構建系統基礎鏡像 alpine glibc 的Dockerfile內容如下&#xff1a; alpine:3.6 MAINTAINER tongqiang<tongqiangyingmail.com># Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.ENV ALP…

單工 半雙工 全雙工

1 單工 單工就是指A只能發信號&#xff0c;而B只能接收信號&#xff0c;通信是單向的&#xff0c;就象燈塔之于航船——燈塔發出光信號而航船只能接收信號以確保自己行駛在正確的航線上。 2 半雙工 半雙工就是指A能發信號給B&#xff0c;B也能發信號給A&#xff0c;但這兩…

c語言兩個循環的ys,c語言編程:從鍵盤輸入兩個數,求它們的最小公倍數

滿意答案flywisdom2019.06.20采納率&#xff1a;44% 等級&#xff1a;9已幫助&#xff1a;1064人main(){int p,r,n,m,temp;printf("Please enter 2 numbers n,m:");scanf("%d,%d",&n,&m);//輸入兩個正整數.if(n{tempn;nm;mtemp;}pn*m;//P是原來…

每日微軟面試題

每日微軟面試題——day 1 <以下微軟面試題全來自網絡> <以下答案與分析純屬個人觀點&#xff0c;不足之處&#xff0c;還望不吝指出^_^> 題&#xff1a;.編寫反轉字符串的程序&#xff0c;要求優化速度、優化空間。 分析&#xff1a;構建兩個迭代器p 和 q &…

第八章 多態

第八章 多態1. 重寫一個類通過繼承來產生一個新類&#xff0c;繼承了父類的所有變量和方法&#xff0c;在繼承這些變量和方法的時候&#xff0c;子類也可以具有自己獨特的特征和行為。Public class fruit{Public void print(){System.out.println(“這是超類的方法”);}}Clas…

Ionic Angular自動捕獲錯誤 配置Angular2.x +

配置app.module.ts import { Pro } from ionic/pro;// These are the imports required for the code below, // feel free to merge into existing imports. import { Injectable, Injector } from angular/core; import { IonicErrorHandler } from ionic-angular;const Ioni…

信道和物理媒體的區別

一個信道可以包含很多的物理媒體嗎&#xff0c;同時一個物理媒體也可以包含很多的信道。 信道借助于物理媒體實現數據傳輸&#xff0c;在比較遠的數據傳輸過程中可能會使用多個不同的物理媒體實現數據的傳輸。 而一個物理媒體也可以借助于多路復用技術實現多條信道

c語言刪除尾部空格函數,新人提問:如何將輸出時每行最后一個空格刪除

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓如何將每行最后一個空格刪除&#xff0c;使矩陣只有數字間有空格&#xff0c;沒有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…

jsonArray與 jsonObject區別與js取值

一、JSONObject和JSONArray的數據表示形式 JSONObject的數據是用 { } 來表示的&#xff0c; 例如&#xff1a; { "id" : "123", "courseID" : "huangt-test", "title" : "提交作業", "content" : nu…

計劃任務 at,cron

示例&#xff1a;每3小時echo和wall命令 轉載于:https://www.cnblogs.com/momenglin/p/8551618.html

代碼疑云

代碼疑云(1)-掌握初始化列表 代碼&#xff1a; [cpp] view plaincopy#include<iostream> using namespace std; class A { private: int x1; int x2; public: A():x2(1),x1(x2){} //初始化列表 void print() { cout<<"x1"<&…

網絡擁塞

擁塞&#xff08;Congestion&#xff09;指的是在包交換網絡中由于傳送的包數目太多&#xff0c;而存貯轉發節點的資源有限而造成網絡傳輸性能下降的情況。擁塞的一種極端情況是死鎖&#xff08;Deadlock&#xff09;&#xff0c;退出死鎖往往需要網絡復位操作。

android 多線程future,多線程FutureTask的使用方法和使用實例

FutureTask是一種可以取消的異步的計算任務。它的計算是通過Callable實現的&#xff0c;它等價于可以攜帶結果的Runnable&#xff0c;并且有三個狀態&#xff1a;等待、運行和完成。完成包括所有計算以任意的方式結束&#xff0c;包括正常結束、取消和異常。Future有個get方法而…

2017.12.26

轉載于:https://www.cnblogs.com/dyh-air/p/8118961.html

mac 下安裝pip

pip是常用的python包管理工具&#xff0c;類似于java的maven。用python的同學&#xff0c;都離不開pip。 在新mac中想用home-brew安裝pip時&#xff0c;遇到了一些小問題&#xff1a; bogon:~ wanglei$ brew install pip Error: No available formula with the name "pip&…

IT職場人生系列

IT職場人生系列之一&#xff1a;序言及找誰占卜 本文是IT職場人生系列的第一篇。 時間流逝&#xff0c;漸漸從之前在公司里邊的小弟變成大哥了&#xff0c;當年身邊比我大的程序員們都不見了&#xff0c;既沒有當領導也沒有去創業&#xff0c;就這么消失了。 年輕的程序員或…