JS实现大数相加大数相乘示例详解

JS实现大数相加大数相乘示例详解

目录

JS大数相加、大数相乘

一、实现两个大数相加

二、实现两个大数相乘

JS大数相加、大数相乘

JavaScript 只有一种数字类型,可以使用也可以不使用小数点来书写数字。

JavaScript 中,数字不分为整数类型和浮点数类型,所有的数字都是浮点数类型JavaScript 采用 IEEE754 标准定义的 64 位浮点格式表示数字,此格式用 64 位存储数值。其中 0~51存储数字片段,52~62存储指数,63 位存储符号。

来看看 JavaScript 中数字的最大值最小值

console.log(Number.MAX_VALUE); // 1.7976931348623157e+308 console.log(Number.MIN_VALUE); // 5e-324

注:

这里的最大值指的是字面意思上的最大值;

最小值则指的是正数情况下小数点后能表示的最小值。

一、实现两个大数相加

思路:

大数可能会超出 JavaScript数字类型范围,超出后结果损失精度,所以可以用字符串的方式来存储大数。

题解:

let a = "9876543210123456789000000000123"; let b = "1234567898765432100000012345678901"; function add(str1, str2) { // 获取两个数字的最大长度 let maxLength = Math.max(str1.length, str2.length); // 用0补齐长度,让它们两个长度相同 str1 = str1.padStart(maxLength, 0); // "0009876543210123456789000000000123" str2 = str2.padStart(maxLength, 0); // "1234567898765432100000012345678901" let temp = 0; // 每个位置相加之和 let flag = 0; // 进位:相加之和如果大于等于10,则需要进位 let result = ""; for(let i=maxLength-1; i>=0; i--) { // 获取当前位置的相加之和:字符串1 + 字符串2 + 进位数字 temp = parseInt(str1[i]) + parseInt(str2[i]) + flag; // 获取下一个进位 flag = Math.floor(temp/10); // 拼接结果字符串 result = temp%10 + result; } if(flag === 1) { // 如果遍历完成后,flag还剩1,说明两数相加之后多了一位,类似于:95 + 10 = 105 result = "1" + result; } return result; } 二、实现两个大数相乘

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

思路:

首先,两个多位数相乘,我们可以分解成其中一个多位数另一个多位数的每一位相乘 这里利用的思路和上面的大数相加一致

得到其每一位相乘的结果后,在其结果后面补齐相应的0,并将其放入结果数组中

最后,用上述大数相加的函数,对结果数组进行累加,即可得到最终的相乘字符串了。

需要注意的点是相乘的两数其中之一可能是0,所以最后一步需要将左侧的0(除了最右边的一位)全部去掉

function multiply(str1, str2) { let result = ""; const multiplyArr = []; let count = 0; // 当前位数(从个位开始) // 用位数少的每一位去乘位数多的,这样需要的存储空间更小,运算速度更快 if(str1.length < str2.length) { [str1, str2] = [str2, str1]; } // 循环用第二个数的每一位乘以第一个数 for(let i=str2.length-1; i>=0; i--) { let multiplyItem = manyMultiplyOne(str1, str2[i]); // 获取多位数乘单位数的结果 multiplyArr[count] = multiplyItem.padEnd(multiplyItem.length + count, "0"); // 进行补0操作 count++; } // 接下来,将multiplyArr中的每一项累加,就能得到最终的结果了 result = multiplyArr[0] // 从第一个开始累加 for(let i=1; i<multiplyArr.length; i++) { result = add(result, multiplyArr[i]); } // 去除末尾以外的前置0 result = removeLeftZero(result); return result; } /** * 多位数乘单个数 */ function manyMultiplyOne(many, one) { let temp = 0; // 每个位置相乘的结果 let flag = 0; // 进位数 let result = ""; // 进行每一位的乘法运算,并进行进位操作(从后往前操作,代表从最小位置开始:个十百千万) for(let i=many.length-1; i>=0; i--) { temp = many[i] * one + flag; // 获取当前项的乘积 flag = Math.floor(temp/10); // 获取进位数 result = temp%10 + result; } // 最后,如果进位还要剩下,则将进位放在最前面 if(flag !== 0) { result = flag + result; } return result; } // 两数相加,用的上面介绍的函数 function add(str1, str2) { // 获取两个数字的最大长度 let maxLength = Math.max(str1.length, str2.length); // 用0补齐长度,让它们两个长度相同 str1 = str1.padStart(maxLength, 0); // "0009876543210123456789000000000123" str2 = str2.padStart(maxLength, 0); // "1234567898765432100000012345678901" let temp = 0; // 每个位置相加之和 let flag = 0; // 进位:相加之和如果大于等于10,则需要进位 let result = ""; for(let i=maxLength-1; i>=0; i--) { // 获取当前位置的相加之和:字符串1 + 字符串2 + 进位数字 temp = parseInt(str1[i]) + parseInt(str2[i]) + flag; // 获取下一个进位 flag = Math.floor(temp/10); // 拼接结果字符串 result = temp%10 + result; } if(flag === 1) { // 如果遍历完成后,flag还剩1,说明两数相加之后多了一位,类似于:95 + 10 = 105 result = "1" + result; } return result; } function removeLeftZero(str) { let count = 0; // 计算从头部开始,有几个0 for(let i=0; i<str.length; i++) { if(str[i] === "0" && i < str.length - 1) { count++; } else { break; } } return str.substr(count, str.length); }

以上就是JS实现大数相加大数相乘示例详解的详细内容,更多关于JS大数相加相乘的资料请关注易知道(ezd.cc)其它相关文章!

推荐阅读

    js设置div的边框|怎样给div设置边框

    js设置div的边框|怎样给div设置边框,,1. 怎样给div设置边框1、首先新建一个html文件,输入基本的内容,这里设置一个div,并把它的class设置为de

    js设置样式|js设置样式类

    js设置样式|js设置样式类,,js设置样式    javascript改变CSS样式分为局部和全局,分别如下:  一、局部改变样式    有三种方法:直接

    js用代码实现简单购物车

    js用代码实现简单购物车,,图: 选择所有按钮: 复制代码代码如下所示: 选择 笔记本电脑:3000元 笔记本电脑:3000元 笔记本电脑:3000元 笔记本电脑:3

    js设置背景色|js设置颜色

    js设置背景色|js设置颜色,,js设置背景色首先通过js定位到div的子元素,再通过setatteibute方法给属性添加背景色。js设置颜色js改变字体的颜

    Safari调试iOS中的js

    Safari调试iOS中的js,页面,设备,概述对于HTML5的开发,大家都知道Chrome的DevTools工具有强大的功能和友好的用户体验,不仅能快速方便调试Jav

    Bootstrap的js插件之模态框|modal

    Bootstrap的js插件之模态框|modal,模态,饭盒,.modal——指明div元素包裹模态框;.fade——给模态框添加淡入淡出效果;.modal-dialog——包裹

    js默认事件汇总

    js默认事件汇总,事件,表单,默认事件   就是浏览器通过HTML标签或DOM元素提供的一些功能性的默认行为。比如在a标签href属性上的跳转,右键

    js获取元素宽度

    js获取元素宽度,内联,样式,js获取元素宽度1、使用内联样式,即直接把CSS写在HTML元素的style属性中<div > </div>复制代码通过以下js代码

    SQLite使用JSON扩展

    SQLite使用JSON扩展,插件,加载,一、介绍 SQLite3.9.0之后的版本,添加了JSON扩展。在表中可以保存JSON类型。实际上SQLite将JSON类型的

    jscript.dll是什么

    jscript.dll是什么,系统,文件,论坛,显示,扫描,修复,  jscript.dll是Microsoft JavaScript脚本支持相关文件。属于: Microsoft JScript系统 DLL

    postgresql中对jsonb的查询及转换

    postgresql中对jsonb的查询及转换,数据,字段,表数据:需要将strata排除,并且过滤info字段中为{}的数据,将jsonb转换成text,替换“,{,}见SQL:sele