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大数相加相乘的资料请关注我们其它相关文章!

(0)

相关推荐

  • JavaScript大数相加相乘的实现方法实例

    前言 JavaScript 中的最大安全整数是 2 ^{53} – 1 ,即 9007199254740991,当我们进行超出这个范围的数值计算的时候就无法得到精确的值,而是一个近似值,比如我们计算 9007199254740991 + 10 得到的结果是 9007199254741000.本文讲一下如何利用字符串在 JavaScript 中实现大数相加相乘. 相加 用字符串实现相加相乘基本思路就是按照我们在纸上进行竖式运算一样.对于加法,我们需要将两个数 num1 和 num2 上下对齐,然后

  • JavaScript 大数据相加的问题

    同样是一道面试题,来自有道前端的面试. 写一个函数处理大数据的相加问题,所谓的大数据是指超出了整型,长整型之类的常规数据类型表示范围的数据.实现语言不限. 我是用js实现的,说一下我自己的思路: 1.首先这个题目最重要的环节在考虑怎么存储大数据?用什么数据类型保存呢?最简单可行的方式是String 2.确定了使用何种类型保存数据之后这个题目就明朗了.首先判断两个传入字符串的长度,取最短的len循环,两者从低位开始对应位相加,同时注意保存进位.在短的数据处理完后,将进位交给较长串的剩余部分处理.

  • JavaScript实现大数的运算

    对于非常大或非常小的数,可以用科学记数法表示浮点值.采用科学记数法,可以把一个数表示为数字加e/E,后面加乘以10的倍数,如: 复制代码 代码如下: var num1 = 3.125e7; // 31250000 var num2 = 3e-17; // 0.00000000000000003 进行特别大的数的加减运算,可以使用字符串+科学记数法的方法来进行,如: 复制代码 代码如下: // 这里只考虑大整数的情况,不考虑小数 function strAdd(sNum1, sNum2){   /

  • JavaScript使用Max函数返回两个数字中较大数的方法

    本文实例讲述了JavaScript使用Max函数返回两个数字中较大数的方法.分享给大家供大家参考.具体如下: JavaScript的Math对象带有一个max函数用于获取两个数字的较大数,下面的代码详细演示了max的用法 <!DOCTYPE html> <html> <body> <p id="demo"> Click the button to return the highest number of 5 and 10. </p&

  • JS实现两个大数(整数)相乘

    大数,即超出语言所能表示的数字最大范围的数字,此时的数字只能用字符串来表示.那么如何实现两个大数相乘呢?我用JS实现了一下,代码如下: 复制代码 代码如下: console.log(bigMut("567", "1234")); // 699678 function bigMut(big, common) { big += ""; common += ""; if (big.length < common.length)

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

    目录 JS大数相加.大数相乘 一.实现两个大数相加 二.实现两个大数相乘 JS大数相加.大数相乘 JavaScript 只有一种数字类型,可以使用也可以不使用小数点来书写数字. 在 JavaScript 中,数字不分为整数类型和浮点数类型,所有的数字都是浮点数类型.JavaScript 采用 IEEE754 标准定义的 64 位浮点格式表示数字,此格式用 64 位存储数值.其中 0~51存储数字片段,52~62存储指数,63 位存储符号. 来看看 JavaScript 中数字的最大值和最小值:

  • JS实现简单的下雪特效示例详解

    目录 前言 主要实现代码 HTML代码 JS代码 前言 很多南方的小伙伴可能没怎么见过或者从来没见过下雪,今天我给大家带来一个小Demo,模拟了下雪场景,首先让我们看一下运行效果 可以点击看看在线运行http://haiyong.site/xiaxue 首先看看项目结构,一张雪花图片,一个.html文件和 jquery-1.4.2.js 用到的雪花图片我放在这里了,或者可以直接用我上传到自己网站上的图片地址:http://haiyong.site/wp-content/uploads/2021/

  • Three.js实现雪糕地球的使用示例详解

    目录 前言 ThreeJS 基础——实现转动的球体 ThreeJS 纹理——实现转动的地球 交互式雪糕地球 添加 loading 效果 前言 最近的天气有几分酷热,去实验室的道路也有几分漫长,走着走着,小包感觉灵魂已经被热出窍了.回到实验室,把空调打开,雪糕吃上,静坐了几分钟,才重新感觉到灵魂的滋味,葛优躺在实验室的小床上,思维开始天马行空,世上有一万种方式能让小包凉快,但地球母亲呐,她却日渐炎热,谁能来给她降降温? 躺着躺着,进入了梦乡,小包梦到未来有一天,人类超级发达,可以穿梭时空,但发展的

  • JS实现简单的操作杆旋转示例详解

    目录 一.实现效果 二.组成部分 目标 三.代码实现 1.操作控制 2.dom对象操作类 3.用法 总结与思考 一.实现效果 JS 简单的操作杆旋转实现 首先说明一下,请直接忽略背景图,这里主要实现的是杆旋转控制方向盘旋转. 鼠标移出控制区域,控制球复位 二.组成部分 创建 ballOption.js 文件,用以绑定控制球指定 dom,并初始化相关操作 创建 eleOption.js 文件,用以实现一些频繁的 dom 操作 主要是通过鼠标滑动事件控制“控制球”位置更改及获取以屏幕上方向为0度的角

  • JS实现一个微信录音功能过程示例详解

    目录 功能原型图 拆解需求 评估时间 代码实现 功能原型图 其实就是微信发送语音的功能.没有转文字的功能. 拆解需求 根据原型图可以很容易的得出我们需要做的内容包括下面三个部分: 接入微信的语音SDK 调用微信SDK的API逻辑 界面和交互的实现 其中第一点和第二点属于业务逻辑部分,第三点属于交互逻辑部分.对于业务逻辑和交互逻辑的关系在我的另外一篇文章描述过,我在vue中是这样拆分组件的 从原型图可以分析出如下的流程图: 评估时间 第三事情是评估时间.在接到这个需求的时候,我们需要假设我们在此之

  • node.js中Util模块作用教程示例详解

    目录 从类型判断说起 严格相等 Error First & Promise 调试与输出 从类型判断说起 在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是简单的使用 typeof 会到各种各样的问题. 举几个简单的: console.log(typeof null) // 'object' console.log(typeof new Array) // 'object' console.log(typeof new String) // 'object' 后来,大

  • Node.js实现分片上传断点续传示例详解

    目录 正文 文件的分片与合并 并发控制 使代码可复用 服务端接口实现 正文 大文件上传会消耗大量的时间,而且中途有可能上传失败.这时我们需要前端和后端配合来解决这个问题. 解决步骤: 文件分片,减少每次请求消耗的时间,如果某次请求失败可以单独上传,而不是从头开始 通知服务端合并文件分片 控制并发的请求数量,避免浏览器内存溢出 当因为网络或者其他原因导致某次的请求失败,我们重新发送请求 文件的分片与合并 在JavaScript中,FIle对象是' Blob '对象的子类,该对象包含一个重要的方法s

  • 原生js中运算符及流程控制示例详解

    运算符 算数:+ 加.- 减.* 乘./ 除.% 求模 赋值:=.+=.-=.*=./=.%= 关系:>.<. >=. <=. ==. ===. !=. !== 逻辑:||或.&&与.!否 实例1.求模 window.onload = function(){ alert(0%2) //0 alert(1%2) //1 alert(2%2) //0 } 实例2.隔行变色 <body> <ol> <li>取模:就是求余数</li

  • js闭包和垃圾回收机制示例详解

    前言 闭包和垃圾回收机制常常作为前端学习开发中的难点,也经常在面试中遇到这样的问题,本文记录一下在学习工作中关于这方面的笔记. 正文 1.闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.作为一个JavaScript开发者,理解闭包十分重要. 1.1闭包是什么? 闭包就是一个函数引用另一个函数的变量,内部函数被返回到外部并保存时产生,(内部函数的作用域链AO使用了外层函数的AO) 因为变量被引用着所以不会被回收,因此可以用来封装一个私有

  • js实例属性和原型属性示例详解

    详情请仔细研读注释,这里就废话少说,直接上代码了. 复制代码 代码如下: <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>测试文档</title>     <script type="text/javascript"> // 实质上属性和方法是一样的,方法是属性为引用型的函数. //一个对象有4种

随机推荐