本方法的思路为:

  一:检查了输入的合法性(非空,无非法字符)

  二:检查输入是否可以进行简单计算(一个数为 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

JS实现大整数乘法(性能优化、正负整数)相关推荐

  1. spark写入oracle 优化,spark读写数据库大表分区性能优化

    spark读写数据库大表分区性能优化:经常会遇到spark读写数据库再做分析,像mysql或oracle. 在数据量很大的情况下,如果只有一个worker一个excutor一个task,那你excut ...

  2. 通过矩阵乘法性能优化学习CUDA

    通过矩阵乘法性能优化学习CUDA 概述 GPU Architecture GPU中的几个基本概念 物理概念: 软件概念: cuda内存模型 小结: 补充: CUDA shared memory和线程束 ...

  3. Node.js 根本没有这样搞性能优化的?

    1.使用最新版本的 Node.js 仅仅是简单的升级 Node.js 版本就可以轻松地获得性能提升,因为几乎任何新版本的 Node.js 都会比老版本性能更好,为什么? Node.js 每个版本的性能 ...

  4. Java 中 10 大简单的性能优化

    点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! Java 7 ForkJoinPool和 Java 8 的并行Stream有助于并行化东西,这在您将 Java 程 ...

  5. 开课吧大圣老师性能优化训练营笔记

    切记:过度优化是万恶之源 一.从输入url到页面显示发生了什么(万能面试题)** 宏观层面: DNS其实也是一个网络协议 把域名变成ip地址, dns解析后获取到目标地址的ip,我们会基于这个ip地址 ...

  6. 【ELT.ZIP】OpenHarmony啃论文俱乐部——大数据框架性能优化系统

    本文出自ELT.ZIP团队,ELT<=>Elite(精英),.ZIP为压缩格式,ELT.ZIP即压缩精英. 成员: 上海工程技术大学大二在校生 合肥师范学院大二在校生 清华大学大二在校生 ...

  7. 计算机组成原理整数乘法,计算机组成原理 - 定点整数的原码补码运算(待验证)...

    计算机组成原理 - 定点整数的原码补码运算(待验证) 目录 〇.环境 对象 运算 定点整数原码.定点整数补码 移位.加.减.乘.除 原码定义: \(x=\begin{cases} x &0\l ...

  8. Pandas处理大数据的性能优化技巧

    Pandas是Python中最著名的数据分析工具.在处理数据集时,每个人都会使用到它.但是随着数据大小的增加,执行某些操作的某些方法会比其他方法花费更长的时间.所以了解和使用更快的方法非常重要,特别是 ...

  9. 大数据量性能优化之分页查询

    刷帖子翻页需要分页查询,搜索商品也需分页查询.当遇到上千万.上亿数据量,怎么快速拉取全量数据呢? 比如: 大商家拉取每月千万级别的订单数量到自己独立的ISV做财务统计 拥有百万千万粉丝的大v,给全部粉 ...

  10. Android大图片背景性能优化篇

    内存优化-Android大图片 最近在做一个游戏项目,项目中使用大量的1080P作为背景图片,整个APP内存很快就超过峰值,导致项目中出现多处内存溢出.掉帧现象. Meizu Mx4pro(260M左 ...

最新文章

  1. djano-cms学习笔计(一)
  2. 记一次 .NET 某智慧水厂API 非托管内存泄漏分析
  3. java 传入多个参数时报Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1,... 解决方案...
  4. [剑指offer]面试题第[53-1]题[JAVA][在排序数组中查找数字-1][二分法][暴力法]
  5. 公式之美:打通复杂思维的任督二脉
  6. 贪婪算法在解决哈夫曼树及编码问题中的应用
  7. oracle不同环境数据迁移,生产环境下,oracle不同用户间的数据迁移。第一部分
  8. python面向对象代码_两百行代码搞定!使用Python面向对象做个小游戏
  9. 分布式系统原理_终于有架构大牛把分布式系统概念讲明白了,竟然用了足足800页...
  10. 基于浏览器的开源“管理+开发”工具,Pivotal MySQL*Web正式上线!
  11. The Most Important Skill for Software Architects
  12. python创建学生类和教师类_python基础知识 ——类
  13. 苹果电脑上几款不错的cad绘图软件
  14. 肿瘤(Oncology)生物信息学分析简介
  15. DHT11温湿度模块
  16. 夜光带你走进C# 游戏开发等(七十九)擅长的领域
  17. ubuntu添加并查看 用户组和用户
  18. 初探机器学习与评分卡模型
  19. UID GID 说明及例子
  20. Java小游戏------飞翔的小鸟

热门文章

  1. druid加密mysql_Druid 数据库用户密码加密 代码实现
  2. 【洛谷 - P3376 】【模板】网络最大流
  3. 详解车道线检测数据集和模型 VIL-100: A New Dataset and A Baseline Model for Video Instance Lane Detection
  4. Waymo离线点云序列3D物体检测网络 (3D Auto Labeling): Offboard 3D Object Detection from Point Cloud Sequences
  5. 河南省高考让不让带计算机,河南高考2018严禁携带的东西有哪些?这种衣服不能进考场...
  6. C# XML字符串与DataTable相互转换
  7. 遍历这些字符串,如果字符串没有包含数字的,就将字符串中的小写字母转成大写字母并打印字符串
  8. 要求将数组中的0项去掉,将不为0的值存入一个新的数组,
  9. c语言 增删查 案例,C语言实现单链表的增删查改
  10. 剑指offer:31-32记录(4道)