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

来源:脚本之家  责任编辑:小易  
目录
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大数相加相乘的资料请关注真格学网其它相关文章!

您可能感兴趣的文章:JavaScript大数相加相乘的实现方法实例JavaScript使用Max函数返回两个数字中较大数的方法JavaScript实现大数的运算JS实现两个大数(整数)相乘JavaScript 大数据相加的问题

  • 本文相关:
  • 微信小程序 loading 详解及实例代码
  • javascript使用integrity属性进行安全验证
  • 微信小程序 教程之模板
  • checkbox 如何实现全选?
  • 微信小程序(十五)checkbox组件详细介绍
  • javascript闭包closure详述
  • 微信小程序 action-sheet 反馈上拉菜单简单实例
  • 关于js typeof 与 instanceof 判断数据类型区别及开发使用
  • 8个工程必备的javascript代码片段
  • 微信小程序(十二)text组件详细介绍
  • 如何实现大数相乘?
  • 各位高手 这是两个大数相加 请帮忙改成两个大数相减 谢谢
  • 如何用C#实现大数相加,思路我知道要代码哦🙏🏻
  • C++中如何实现大数相加、1000位以内、
  • C语言如何实现大数相加问题,各位高手多多指教!
  • 请教个C++代码,实现大数相加的,刚学C++,这样写有错,不知道错...
  • c语言如何实现多对大数相加?
  • 求编写c程序实现两个大数相加和相减,用main函数调用
  • 听说JAVA有个类能直接实现两个大数相加。额。是哪个类?最...
  • 运用JAVA中大数类实现大数的四则运算
  • 运用JAVA中大数类实现大数的四则运算
  • 为什么一个大数加一个小数相加等于这个大数
  • 有两个数 大数减去小数等于8 大数除以小数等于9 两个数相乘也...
  • c语言编程:大数相加。实现2个大整数(绝对值≤10的10次方-1)...
  • 求c++大数相乘算法。用数组实现int * fun(int a[],int b[],int c[])
  • 设计大数类。可以实现大数的基本加减乘除运算。
  • 数相加之和等于789,大数去个位等于小数问大数多少
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全javascriptasp.netphp编程ajax相关正则表达式asp编程jsp编程编程10000问css/htmlflex脚本加解密web2.0xml/rss网页编辑器相关技巧安全相关网页播放器其它综合dart首页javascriptjavascript大数相加相乘的实现方法实例javascript使用max函数返回两个数字中较大数的方法javascript实现大数的运算js实现两个大数(整数)相乘javascript 大数据相加的问题微信小程序 loading 详解及实例代码javascript使用integrity属性进行安全验证微信小程序 教程之模板checkbox 如何实现全选?微信小程序(十五)checkbox组件详细介绍javascript闭包closure详述微信小程序 action-sheet 反馈上拉菜单简单实例关于js typeof 与 instanceof 判断数据类型区别及开发使用8个工程必备的javascript代码片段微信小程序(十二)text组件详细介绍微信小程序 数组(增,删,改,查)等操作实例详解微信小程序 for 循环详解微信小程序 小程序制作及动画(animation样式)详解微信小程序 input输入框控件详解及实例(多种示例)微信小程序 input输入框详解及简单实例微信小程序 传值取值的几种方法总结微信小程序 时间格式化(util.formattime(ne微信小程序中使元素占满整个屏幕高度实现方法微信小程序 wx.request(接口调用方式)详解及实例微信小程序通过api接口将json数据展现到小程序示例微信小程序 常用工具类详解及实例使用?render?函数封装高扩展的组件微信小程序 刷新上拉下拉不会断详细介绍微信小程序 免费ssl证书https、tls版本问题的解决办法二维码条形码生成的javascript脚本库微信小程序 record api详解及实例代码微信小程序 自定义toast实例代码微信小程序 摇一摇抽奖简单实例实现代码微信小程序 progress组件详解及实例代码微信小程序 滚动到某个位置添加class效果实现代码
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved