js实现高精度加减乘除模板

高精度加法

我们一起来模拟一下小学的时候我们怎么算加法的,如 298 + 67

  1. 先个位相加:8 + 7 = 15,个位结果是5,十位进位为1
  2. 再十位相加:9 + 6 = 15, 十位得到5,再加上个位的进位,得到结果是6,向百位进位为1
  3. 最后百位相加:2 + 1(进位)= 3

得到答案是365

代码

大整数相加一般会超过我们存储的最大位数,所以我们一般用字符串来存储。

我们每次都是从个位开始计算,所以采用倒序遍历的方式

ini 复制代码
function add(a , b) {
    let res = "";
    // 用tmp来表示进位信息
    let tmp = 0;
    for(let i = a.length - 1, j = b.length - 1; i >= 0|| j >= 0; i--,j--) {
        if (i >= 0) tmp += a[i] - '0';
        if (j >= 0) tmp += b[j] - '0';
        // 结果
        res += tmp % 10;
        // 得到进位,下一次循环中,会直接加上上次的进位数
        tmp = Math.floor(tmp / 10);
    }
    if(tmp) res += tmp;
    return res.split('').reverse().join('');
}
​
let res = add("298 ","67");
console.log(res)

高精度减法

模拟一下减法运算,如 171 - 29

  1. 先个位相减:1 - 9 需要向十位借位得11 - 9 = 2
  2. 十位相减:7 - 1(借位) - 2 = 4
  3. 百位 1 - 0 = 1

答案是142

代码

ini 复制代码
function sub(a, b) {
    let t = 0;
    let res = "";
    for(let i = a.length - 1, j = b.length - 1; i >= 0|| j >= 0; i--,j--) {
        // 先减去上一次的借位,t初始化为0
        if(i >= 0) t = +a[i] - t;
        if(j >= 0) t -= +b[j];
        // 如果是负数就借位再取余
        res += (t + 10) % 10;
        
        // t < 0 表示有借位
        if(t < 0) t = 1;
        else t = 0;
    }
    // 去除前导0,如69-69,只保留最后一个0即可
    while(res[res.length - 1] === '0' && res.length > 1) res = res.slice(0,res.length - 1);
    return res.split('').reverse().join('');
}
​
console.log(sub("5432117","2119"))

高精度乘法

注意:我们这里的高精度乘法,指的是一个高精度的数a和低精度的数b相乘,所以我们使用字符串存储a,b是一般的数字类型

如:78*66 我们可以将66看成一个整体,如果对66看出一个整体不太理解的,可以模拟计算一下 78 * 6

  1. 8*6 = 48 个位为 48 % 10 = 8,进位为48 / 10 = 4
  2. 7*6 = 42 个位为42 % 10 = 2 + 上次的进位4 = 6,并进位42 / 10 = 4
  3. 答案为468

将b看出一个整体,计算方法其实是一样的

代码

ini 复制代码
function mul(a, b) {
    let t = 0;
    let res = "";
    for(let i = a.length - 1; i >= 0; i--) {
        // 加上上一次的进位,初始化t = 0
        t += +a[i]*b;
        res += t % 10;
        // 保留进位
        t = Math.floor(t / 10);
    }
    if(t) res += t;
    // 去除前导0
    while(res[res.length - 1] === '0' && res.length > 1) res = res.slice(0, res.length - 1)
    return res.split('').reverse().join('');
}
​
console.log(mul('88',66))

高精度除法

和高精度乘法同理,也是一个高精度的数a和低精度的数b相除

代码

ini 复制代码
function div(a,b) {
    const num = [];
    for(let i = a.length - 1; i >= 0; i--) {
        num.push(a[i] - '0');
    }
    let t = 0;
    let res = "";
    for(let i = num.length - 1; i >= 0; i--) {
        t = t*10 +num[i]
        res += Math.floor( t / b );
        t %= b;
    }
    while(res.length > 1 && res[0] === '0') res = res.slice(1,res.length)
    return [res,t];
}
​
console.log(div('7',2))
相关推荐
海带紫菜菠萝汤几秒前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm
冻柠檬飞冰走茶2 分钟前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法
鱼子星_3 分钟前
《算 · 法》题目解析篇(1):最近公共祖先问题,线段树,最长回文子序列
c++·算法·动态规划·递归
雾喔4 分钟前
算法练习5
算法·代理模式
名字还没想好☜8 分钟前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
Access开发易登软件8 分钟前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access
10share17 分钟前
React 新一代样式隔离方案 —— 编译时、零运行时、原生写法
前端·react.js
问商十三载19 分钟前
RAG 检索召回越多越好?2026 信噪比模型深度解析
人工智能·算法·机器学习
额恩6620 分钟前
ResearchPilot 第三阶段总结报告
python·算法
Revolution6128 分钟前
Node.js 是什么:前端项目里哪些事情由它完成
前端·面试·node.js