基础算法(8):高精度加减乘除

本文详细介绍了如何使用C++实现高精度的加法、减法、乘法(包括乘低精度和乘高精度)以及除法。通过数组存储每位数字并处理进位,解决了大数运算超出整数范围的问题。

目录

1.高精度加法

模板:

例题:

2.高精度减法

模板:

例题:

3.高精度乘法

3.1 高精度乘低精度

模板:

例题:

3.2 高精度乘高精度

模板:

例题:

​编辑 

 4.高精度除法

模板:

例题:


     为什么要有这么一种算法?因为当我们想需要对两个很大的数进行运算,比如两个很大的数相加相乘或相除38149194919814894819(+ - * /)89198481314819,结果很显然超出了int范围能表示的整数,我们这时候就要用到高精度算法,高精度算法通过用数组来存储数字的每一位,然后进行运算进位,最后通过数组来输出结果

1.高精度加法

模板:

// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size()||i < B.size(); i ++ )//判断A和B的大小
    {
        if (i < A.size()) t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }

    if (t) C.push_back(t);
    return C;
}

例题:

2

#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int> &A,vector<int> &B)
{
    vector<int>C;
    int t=0;
    for(int i=0;i<A.size()||i<B.size();i++)
    {
        if(i<A.size())t+=A[i];
        if(i<B.size())t+=B[i];
        C.push_back(t%10);
        t/=10;
    }
    if(t)C.push_back(1);
    return C;
}
int main()
{
    string a,b;
    vector<int>A,B;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');//我们将个位数存到第一个元素,这样可以更好的在最后补位,因为在数组末尾添加元素是比较容易的
    for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
    auto C=add(A,B);
    for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);//因为是逆序存储,输出的的时候也要从最后开始输出
    return 0;
    
}

2.高精度减法

模板:

//C=A-B 且A>B
vector<int> sub(vector<int>& A,vector<int>& B)
{
    vector<int> C;
    for(int i=0,t=0;i<A.size();i++)
    {
        //每次循环进行A[i]-B[i]-t运算
        t=A[i]-t;//减去上次运算借的位,没有借位就减去0,借位就减去1
        if(i<B.size())t-=B[i];//判断B[i]是否存在,如果存在,上一步算完A[i]减去进位的值
        //等于t,t=t-B[i],算的就是该位两数相减的值
        C.push_back((t+10)%10);//有两种情况,一种算完t<0,这时候向前借一位,即t+10,就是这一位的值;还有一种是t>0,为了减少代码,我们也+10再%10,就抵消了
        i
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

c++机械师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值