高精度模板 - 加、减、乘、除法(C++实现)

高精度模板 - 加、减、乘、除法(C++实现)

四 个 模 板 均 是 基 于 正 整 数 之 间 的 操 作 , 若 出 现 负 数 , 可 以 通 过 符 号 的 添 加 来 转 化 到 正 整 数 上 来 。 四个模板均是基于正整数之间的操作,若出现负数,可以通过符号的添加来转化到正整数上来。

一、高精度加法

数 组 A 和 数 组 B 按 照 低 位 在 前 , 高 位 在 后 , 将 两 个 大 数 存 储 起 来 。 ( 原 因 是 在 数 组 的 末 尾 添 加 数 字 方 便 进 位 ) 。 模 拟 笔 算 加 法 , 借 助 一 个 进 位 标 记 即 可 。 数组A和数组B按照低位在前,高位在后,将两个大数存储起来。(原因是在数组的末尾添加数字方便进位)。\\模拟笔算加法,借助一个进位标记即可。 AB(便)


代码:

#include<iostream>
#include<vector>
#include<string>

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(t);
    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--) cout<<C[i];
    cout<<endl;
    
    return 0;
}

二、高精度减法

同 加 法 类 似 , 需 要 注 意 的 是 :   ① 、 用 大 数 建 小 数 , 再 考 虑 是 否 需 要 添 加 负 号 。 ② 、 第 i 位 的 值 为 A [ i ] − B [ i ] − t ( t 是 借 位 标 志 , 若 A 被 前 一 位 借 位 , 那 么 t = 1 , 否 则 t = 0 ) 。 若 t > = 0 , 直 接 减 得 到 结 果 , 否 则 将 t + 10 ( 借 位 借 来 的 10 ) , 总 结 起 来 , 这 个 结 果 为 ( t + 10 ) % 10 。 ③ 、 要 去 除 前 导 0 。 同加法类似,需要注意的是:\\ \ \\①、用大数建小数,再考虑是否需要添加负号。\\②、第i位的值为A[i]-B[i]-t(t是借位标志,若A被前一位借位,那么t=1,否则t=0)。\\\qquad若t>=0,直接减得到结果,否则将t+10(借位借来的10),总结起来,这个结果为(t+10)\%10。\\③、要去除前导0。  iA[i]B[i]t(tAt=1t=0)t>=0t+10(10)(t+10)%100


代码:

#include<iostream>
#include<string>
#include<vector>

using namespace std;

//A>=B ?
bool cmp(vector<int> &A,vector<int> &B)
{
    if(A.size()!=B.size()) return A.size()>B.size();
    
    for(int i=A.size()-1;i>=0;i--)
        if(A[i]!=B[i]) 
            return A[i]>B[i];
            
    return true;
}

vector<int> sub(vector<int> &A,vector<int> &B)
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t=A[i]-t;
        if(i<B.size()) t-=B[i];
        C.push_back((t+10)%10);
        if(t<0) t=1;
        else t=0;
    }
    
    while(C.size()>1&&C.back()==0) C.pop_back();
    
    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');
    
    vector<int> C;
    if(cmp(A,B)) C=sub(A,B);
    else C=sub(B,A),cout<<"-";
    
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    cout<<endl;
    
    return 0;
}

三、高精度乘法

与 加 法 类 似 , 这 里 是 一 个 高 精 度 × 低 精 度 的 模 板 , 就 是 数 组 A × 整 型 数 B 。 模 拟 竖 式 计 算 , 但 是 把 整 数 B 看 作 一 个 整 体 , 第 i 位 的 值 为 A [ i ] × B + t ( 进 位 ) 。 与加法类似,这里是一个高精度×低精度的模板,就是数组A×整型数B。\\模拟竖式计算,但是把整数B看作一个整体,\\第i位的值为A[i]×B+t(进位)。 ×A×BBiA[i]×B+t()


代码:

#include<iostream>
#include<string>
#include<vector>

using namespace std;

vector<int> mul(vector<int> &A,int B)
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size()||t;i++)
    {
        t+=A[i]*B;
        C.push_back(t%10);
        t/=10;
    }
    
    if(t) C.push_back(t);
    
    while(C.size()>1&&C.back()==0) C.pop_back();
    
    return C;
}

int main()
{
    string a;
    int B;
    vector<int> A;
    cin>>a>>B;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    
    auto C=mul(A,B);
    
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    cout<<endl;
    return 0;
}

四、高精度除法

同 乘 法 类 似 , 需 要 注 意 的 是 : ① 、 模 拟 除 法 的 过 程 中 , 是 从 高 位 向 低 位 进 行 计 算 的 。 ② 、 需 要 去 除 前 导 零 , 去 除 之 前 别 忘 了 高 低 位 翻 转 。 同乘法类似,需要注意的是:\\①、模拟除法的过程中,是从高位向低位进行计算的。\\②、需要去除前导零,去除之前别忘了高低位翻转。


代码:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

vector<int> div(vector<int> &A,int B,int &r)
{
    vector<int> C;
    r=0;
    for(int i=A.size()-1;i>=0;i--)
    {
        r=r*10+A[i];
        C.push_back(r/B);
        r%=B;
    }
    
    reverse(C.begin(),C.end());
    while(C.size()>1&&C.back()==0) C.pop_back();
    return C;
}

int main()
{
    string a;
    vector<int> A;
    int B;
    cin>>a>>B;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    
    int r;
    auto C=div(A,B,r);
    
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    cout<<endl<<r<<endl;
    
    return 0;
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值