本方法的思路为:

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

  二:检查输入是否可以进行简单计算(一个数为 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. url的参数解析成key-value

    function urlController(url) { var _url = url.split("?")[1]; if(!_url){ return {}; } var wi ...

  2. 详解Python变量在内存中的存储

    这篇文章主要是对python中的数据进行认识,对于很多初学者来讲,其实数据的认识是最重要的,也是最容易出错的.本文结合数据与内存形态讲解python中的数据,内容包括: 引用与对象 可变数据类型与不可 ...

  3. 计算一个字符串的每个字符出现的次数案例——Map集合

    其中,字符的包装类是Character;字符串包装类是String: 遍历字符串转换的数组,每个元素都是一个字符,看创建的这个集合有木有,一开始肯定是没有的其实,字符作为key,所以判断的是这个创建的 ...

  4. Linux分区、文件系统

    Linux分区类型: ◆主分区:总共最多只能分四个 ◆扩展分区:只能有一个,也算作主分区的一种,也就是 说主分区不能存储数据和格式化,必须再划分为逻辑分区才能使用. ◆逻辑分区:逻辑分区是在扩展分区中 ...

  5. ci 配置ckeditor + ckfinder 无图片上传按钮

    一:配置路径有问题 {$base_url}assets/js/editor/ckfinder/ckfinder.html  --> http://www.cnblogs.com/assets/j ...

  6. 用ab的post方式进行测试

    一.Ab是常用的性能测试工具,因为它支持windows…… 通常使用的命令是ab –c –n –k -r,分别表示:模拟终端数.发送包数.请求是否带keepalive.忽略错误,默认都是以GET方式去 ...

  7. Shell 实践、常用脚本

    (1)计算1-100的和. #!/bin/bash n= ` do n=$[$i+$n] done echo $n (2)输一个数字,然后计算出1到数字的和,要求如果输入数字小于1,则重新输入,知道输 ...

  8. 剑指offer(35)数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  9. JS设计模式(7)组合模式

    什么是组合模式? 定义:1.将对象组合成树形结构以表示"部分-整体"的层次结构.2.组合模式使得用户对单个对象和组合对象的使用具有一致性.3.无须关心对象有多少层,调用时只需在根部 ...

  10. 继上篇后的Excel批量数据导入

    上篇Excel动态生成模板,此篇将借用此模板进行Excel数据的批量导入. 说明:由于数据库中部分数据储存的是编码或者Id,因此,这里就需要用到上篇中的全局数据,判断是否有数据,有数据直接使用,没有数 ...