本方法的思路为:

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

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

JS实现大整数乘法(性能优化、正负整数)的更多相关文章

  1. 3-0 js基础 语言特性及性能优化

    1.语言特性: 内存泄露:内存没有释放,越堆越多. 垃圾回收(生命周期): 1.局部 很短 在局部中当函数完成时.已经释放了.全局变量在页面关闭的时候才被回收. 2.全局 很长 3.闭包.可长可短,只 ...

  2. jQuery.Validate.js验证大表单的优化

    最近在项目中有遇到一个Form表单中有200多个标签.在提交表单时网页会出现等待时间很长,甚至会出现网页奔溃的情况. 主要的原因是因为在使用jQuery.Validate.js进行Form验证的时候会 ...

  3. 大流量网站性能优化:一步一步打造一个适合自己的BigRender插件

    BigRender 当一个网站越来越庞大,加载速度越来越慢的时候,开发者们不得不对其进行优化,谁愿意访问一个需要等待 10 秒,20 秒才能出现的网页呢? 常见的也是相对简单易行的一个优化方案是 图片 ...

  4. js动态加载js文件(js异步加载之性能优化篇)

    1.[基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完成页面渲染而不会造成页面堵塞问题,这个大家都懂. 2.[合并JS代码,尽可能少的使 ...

  5. ZCGL大数据平台性能优化

    对HBase数据库建索引 参见:基于Phoenix对HBase建索引   https://www.cnblogs.com/ratels/p/11203313.html 将HBase访问微服务整合到模块 ...

  6. 你不知道的Node.js性能优化,读了之后水平直线上升

    本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 D ...

  7. MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)

    最近帮忙公司的几个项目组进行了不同方面的性能优化,发现几个项目都出现了一些共性的问题.这里写一篇文章,总结一下这几类问题,以及其对应的解决方案.方便其它项目组参考.   常见问题一:打开页面非常慢,有 ...

  8. Android App 性能优化实践

    本文记录了Android App优化需要用到的工具和以及在实践中的Tips.也算对我这半年来部分工作的总结. 工具 Hierarchy Viewer 是 Android SDK 自带的 Layout ...

  9. Android性能优化典范(二)

    Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...

  10. Android性能优化典范 - 第2季

    Google发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓 ...

随机推荐

  1. ASP.NET MVC案例教程(五)

    ASP.NET MVC案例教程(四) 前言 通过前几篇文章,我们已经能比较自如的使用ASP.NET MVC来呈现页面和数据了.但是,有一个大问题没有解决:如何处理表单数据.例如,我们将要实现的公告发布 ...

  2. Linux基础培训知识点汇总

    一.Linux简介1.Linux操作系统诞生于1991年10月5日,由林纳斯·托瓦兹在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生.2.Linux同时也衍生了很多版本( ...

  3. Why Choose MB SD C5 with Engineer Software

    MB SD C5 with engineer software performed good and now is released. Unlike the old clone C5 which us ...

  4. 常用python的标准库

    1.itsdangerous # 加密签名的数据 2.re # 正则表达式 3.time # 时间模块 4.keyword # 查看关键字5.random # 随机6.uuid

  5. 虚拟机 安装centos

    entOS安装 我是用VMware 12 安装的,下面是安装,打开VM主页 选择创建虚拟机 典型安装:VMwear会将主流的配置应用在虚拟机的操作系统上,对于新手来很友好. 自定义安装:自定义安装可以 ...

  6. K8S学习笔记之Kubernetes 部署策略详解

    0x00 概述 在Kubernetes中有几种不同的方式发布应用,所以为了让应用在升级期间依然平稳提供服务,选择一个正确的发布策略就非常重要了. 选择正确的部署策略是要依赖于我们的业务需求的,下面我们 ...

  7. D1图论最短路专题

    第一题:poj3660 其实是Floyed算法的拓展:Floyd-Wareshall.初始时,若两头牛关系确定则fij = 1. 对于一头牛若确定的关系=n-1,这说明这头牛的排名是确定的. 通过寻找 ...

  8. opencv学习之路(27)、轮廓查找与绘制(六)——外接圆、椭圆拟合、逼近多边形曲线、计算轮廓面积及长度、提取不规则轮廓

    一.最小外接圆 #include "opencv2/opencv.hpp" #include<iostream> using namespace std; using ...

  9. centos7 keepalived 配置高可用

    ! Configuration File for keepalived global_defs { notification_email { xaioqiang.he@xinboxinmo.com } ...

  10. libcurl返回常见错误码

    转载:https://blog.csdn.net/kenkao/article/details/46875571 转载:http://www.cnblogs.com/wainiwann/p/34929 ...