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
* 输出例子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实现大整数乘法(性能优化、正负整数)的更多相关文章
- 3-0 js基础 语言特性及性能优化
1.语言特性: 内存泄露:内存没有释放,越堆越多. 垃圾回收(生命周期): 1.局部 很短 在局部中当函数完成时.已经释放了.全局变量在页面关闭的时候才被回收. 2.全局 很长 3.闭包.可长可短,只 ...
- jQuery.Validate.js验证大表单的优化
最近在项目中有遇到一个Form表单中有200多个标签.在提交表单时网页会出现等待时间很长,甚至会出现网页奔溃的情况. 主要的原因是因为在使用jQuery.Validate.js进行Form验证的时候会 ...
- 大流量网站性能优化:一步一步打造一个适合自己的BigRender插件
BigRender 当一个网站越来越庞大,加载速度越来越慢的时候,开发者们不得不对其进行优化,谁愿意访问一个需要等待 10 秒,20 秒才能出现的网页呢? 常见的也是相对简单易行的一个优化方案是 图片 ...
- js动态加载js文件(js异步加载之性能优化篇)
1.[基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完成页面渲染而不会造成页面堵塞问题,这个大家都懂. 2.[合并JS代码,尽可能少的使 ...
- ZCGL大数据平台性能优化
对HBase数据库建索引 参见:基于Phoenix对HBase建索引 https://www.cnblogs.com/ratels/p/11203313.html 将HBase访问微服务整合到模块 ...
- 你不知道的Node.js性能优化,读了之后水平直线上升
本文由云+社区发表 "当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 D ...
- MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)
最近帮忙公司的几个项目组进行了不同方面的性能优化,发现几个项目都出现了一些共性的问题.这里写一篇文章,总结一下这几类问题,以及其对应的解决方案.方便其它项目组参考. 常见问题一:打开页面非常慢,有 ...
- Android App 性能优化实践
本文记录了Android App优化需要用到的工具和以及在实践中的Tips.也算对我这半年来部分工作的总结. 工具 Hierarchy Viewer 是 Android SDK 自带的 Layout ...
- Android性能优化典范(二)
Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...
- Android性能优化典范 - 第2季
Google发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的缩放,缓 ...
随机推荐
- html5 javascript 事件练习1
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Hadoop -- 概念
hadoop 一个开源的,稳定的,可扩展的,分布式的计算框架 实现单一的服务器到成千上万机器之间共同处理数据的一个可扩展性框架 Hadoop 项目主要包含以下四个模块 Hadoop Common:为其 ...
- 文件夹放到VS2015显示不出来
在该项目中,点这个按钮 , 会显示没有包括进项目的文件 在要包括的文件上右键--包括在项目中即可 同理也可以从项目排除
- 自动生成简单四则运算的C语言程序
该程序是在博客园里面找的,具体是谁的找了半天没找到,无法提供它原本的链接.由于自己写的过于简单,且有一些功能暂时无法实现,所以就找了一个来应付作业,望原谅.在这个程序的源码中我改了一个错误的地方,源码 ...
- vue全局使用axios插件请求ajax
vue全局使用axios插件请求ajax Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方宣布停止更新vue-resource,并推 ...
- Oarcle 入门之注释与关键字
--1.--单行注释 *输入法应定要为英文 --2./*多行注释 *与java相似*/ ------------------------------------------------------ ...
- json字符串、json对象、数组之间的转换
json字符串转化成json对象 // jquery的方法 var jsonObj = $.parseJSON(jsonStr) //js 的方法 var jsonObj = JSON.parse(j ...
- luoguP1281 书的复制 DP,贪心
luoguP1281 书的复制 链接 https://www.luogu.org/problemnew/show/P1281 思路 简单dp,输出方案. 很明显dp记录路径对不对? 恭喜你死了. 求出 ...
- HDU 4010 Query on The Trees(动态树)
题意 给定一棵 \(n\) 个节点的树,每个点有点权.完成 \(m\) 个操作,操作四两种,连接 \((x,y)\) :提 \(x\) 为根,并断 \(y\) 与它的父节点:增加路径 \((x,y)\ ...
- python链接Hive
之前一直用thrift链接Hive,但在运行时总出现问题,一直报缺少模块的错误,装了这个模块,又报缺少那个模块,连了半天,全是泪啊! 原来thrift链接Hive的.py文件后续没人维护,是连不上的. ...