本方法的思路为:

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

  二:检查输入是否可以进行简单计算(一个数为 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. Oracle表空间迁移Move Tablespace

    move一个表到另外一个表空间时,索引不会跟着一起move,而且会失效.(LOB类型例外) move分为: *普通表move *分区表move *LONG,LOB大字段类型move来进行测试和说明. ...

  2. HTTPConnectionPool(host='xx.xx.xx.xx', port=xx): Max retries exceeded with url:(Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x0000015A25025EB8>...))

    HTTPConnectionPool(host='xx.xx.xx.xx', port=xx): Max retries exceeded with url:(Caused by ConnectTim ...

  3. flask 定义数据库关系(一对多)

    定义关系 在关系型数据库中,我们可以通过关系让不同表之间的字段建立联系.一般来说,定义关系需要两步,分别是创建外键和定义关系属性.在更复杂的多对多关系中,我们还需要定义关联表来管理关系.下面我们学习用 ...

  4. 艾妮记账本微信小程序开发(失败版)

    这是一个寒假假期作业,要求是用web开发或者微信小程序或者手机app开发的,我本来是打算用微信小程序开发的,但由于这个后台数据库连接需要通过https认证后的浏览器再访问MySQL.所以做到后台数据库 ...

  5. The Code analysis of the FFDNet model

    1. 读取图像并判断是否为灰度图,如为RGB图转化为灰度图,并读取图像的w.h 2.数据格式转换:将uint8表示的读取图像矩阵变为double表示. 3.加入噪声,如果噪声水平$\sigma = 5 ...

  6. mysql 分组取最新的一条记录(整条记录)

    方法:mysql取分组后最新的一条记录,下面两种方法.一种是先筛选 出最大和最新的时间,在连表查询.一种是先排序,然后在次分组查询(默认第一条),就是最新的一条数据了  #select * from ...

  7. django+nginx+python3 生产环境部署

    一.安装python基础环境 1.安装各类基础模块 yum install  gcc-c++ wget openssl-devel bzip2-devel expat-devel gdbm-devel ...

  8. Codeforces 17E Palisection - Manacher

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个串$s$询问,有多少对回文子串有交. 好像很简单的样子. 考虑能不能直接求,感觉有点麻烦.因为要考虑右端点在当前回文子串内还有区间包含 ...

  9. Ubuntu 安装 Docker CE

    注:本文转载自<Docker入门> 警告:切勿在没有配置 Docker APT 源的情况下直接使用 apt 命令安装 Docker. 准备工作 系统要求 Docker CE 支持以下版本的 ...

  10. 分布式系列 - dubbo服务telnet命令

    dubbo服务发布之后,我们可以利用telnet命令进行调试.管理.Dubbo2.0.5以上版本服务提供端口支持telnet命令,下面我以通过实例抛砖引玉一下: 1.连接服务 测试对应IP和端口下的d ...