高精度算法【加减乘除】

本文详细介绍了如何实现高精度加法、减法、乘法和除法算法,包括操作步骤和代码模板。高精度算法解决了数据溢出问题,通过存储数据到数组并逐一运算来保证精度。加法和乘法中,大数通常放前,小数放后,以简化进位和借位操作。减法和除法同样考虑了顺序和可能的借位。所有运算结束后,可能需要处理前导0。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

😍 前言

在实际应用中,语言提供的数据类型的最大值或最小值可能不足以支撑我们所进行的运算,这时会导致数据的溢出,所以我们需要一种算法来保证运算结果的精度。高精度运算就是为了解决这一问题而来的。简单来说,就是将数据的每一位的分开,存放在数组中,通过对数组中的每个位置来进行相应的运算来的得到最终结果。

需要注意的是:

1、由于数据过大,所以在进行输入的时候一般用字符串来进行存放

2、在将数据的每一位放进数组中时,最好是反着存放,也就是从前往后,位数依次升高。

以存放753 和 964 为例:
在这里插入图片描述

这样存放的好处在于方便进位,当他们需要进位的时,可以直接尾插。如果是正着存放的话每次进位都需要头插,全部数据都要往后挪,过于麻烦。

在这里插入图片描述
同样的在读取数据的时候需要从后往前读取,或者数据逆置一下。


😀 高精度加法

两数相加,数据的前后顺序不影响结果。

但是根据手算,如果是小数加大数的话,不方便进位,所以在进行运算前先保证大数在前,小数在后。方便进行进位运算

🤔 操作步骤

高精度加法的步骤:

a + b

1、将a 和 b 每一位的数据存放分开在数组A 和 B 中(A.size >= B.size)

2、用 t 来保存上一位进位的结果

3、从前往后,同时遍历A 和 Bt 分别加上两个数据的低位A[i] 和 B[i] ,得到这一位的运算结果

4、将这一位的结果的个位尾插进数组中保存起来(一次只能去一位数) ———> (t % 10

5、记录这一位的进位结果 ———> (t / 10

6、重复上述步骤,直到 A 遍历完(因为 A.size >= B.size ,所以 A 结束了,运算也就结束了)

7、最后一次运算可能还需要进位,将 t 中保留的进位结果尾插进数组


😵‍💫 代码模板

     A
  +  B
  —————————
  	 C
// C = A + B, A >= 0, B >= 0, A.size >= B.size
vector<int> add(vector<int> &A, vector<int> &B)
{
   
   
    if (A.size() < B.size())   // 保证位数大的 + 位数小的
    	return add(B, A);

    vector<int> C;		// 保存运算结果
    int t = 0;		// 保存上一次的进位结果
    for (int i = 0; i < A.size(); i ++)
    {
   
   
        t += A[i];		// 依次相加
        
        if (i < B.size())  	// 防止越界
        	t += B[i];
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_featherbrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值