zoukankan      html  css  js  c++  java
  • JavaScript中大数相加的解法

    一、两个大正整数字符串相加

    在JavaScript中,数值类型满足不了大数据容量计算,可以用字符串进行操作
     1 function add(strNum1, strNum2) {
     2   // 将传进来的数字/数字字符串调用toString方法转换成字符串,并进行切割,专成数组
     3   let splitNum1 = strNum1.toString().split(''),
     4     splitNum2 = strNum2.toString().split('')
     5   
     6   // 判断两个数组的长度,进行值的互换,将splitNum1设置为最长的值,方便后续计算
     7   if (splitNum1.length < splitNum2.length) {
     8     let temp = splitNum1
     9     splitNum1 = splitNum2
    10     splitNum2 = temp
    11   }
    12 
    13   // carry: 进位值; currentNum: 相加之后,除以10的余数; sum: 相加的值
    14   let len1 = splitNum1.length,
    15     len2 = splitNum2.length,
    16     carry = 0,
    17     currentNum = 0,
    18     sum = 0
    19 
    20   // len1递减到1之后,循环体中的len1 - 1 = 0 即可拿到下标为零的数组元素,
    21   // 所以这里条件是 大于 0,下面len2 > 0 同理
    22   while (len1 > 0) {
    23     if (len2 > 0) {
    24       sum = parseInt(splitNum1[len1 - 1]) + parseInt(splitNum2[len2 - 1]) + carry
    25     } else {
    26       sum = parseInt(splitNum1[len1 - 1]) + carry
    27     }
    28     carry = Math.floor(sum / 10) // 进位数值
    29     currentNum = sum % 10 // 取余数,作为当前位置的数值
    30     splitNum1[len1 - 1] = currentNum // 设置当前值
    31 
    32     // 相加之后,数值长度都递减
    33     len1--
    34     len2--
    35   }
    36   // 判断是否还有进位
    37   if (carry) {
    38     splitNum1.unshift(1)
    39   }
    40   return splitNum1.join('')
    41 }
    42 let result = add(9527, 2019)
    43 
    44 console.log('result :', result) // result : 11546

    备注:

    在做大数相加,突然想到平时使用 数字.toString 方法会报错,
    但是作为函数参数传进来,直接调用toString方法却不会报错,
    上网搜索了下原因,记录了下来,传送门:Number和toString中的坑
  • 相关阅读:
    01-Git 及其可视化工具TortoiseGit 的安装和使用
    IntelliJ IDEA中Warning:java:源值1.5已过时, 将在未来所有发行版中删除
    JVM学习笔记四_垃圾收集器与内存分配策略
    JVM学习笔记三_异常初步
    CentOs7 图形界面和命令行界面切换
    基本概念一
    JVM学习笔记二_对象的创建、布局和定位
    JVM学习笔记一_运行时数据区域
    个人阅读作业二
    软件工程随笔
  • 原文地址:https://www.cnblogs.com/linjunfu/p/10645498.html
Copyright © 2011-2022 走看看