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.mzph.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;就这么消失了。 年轻的程序员或…