高精度加减法模板(Acwing.791.792)

首先讲一下大数相加其实代码模拟的过程就是模拟小学的加法法则。因为C语音的LL double等太少不能求位数过多的加减法。

下面让我们一起分析一下代码

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 vector<int> add(vector<int> &A,vector<int> &B)
 6 {
 7     vector<int>res;
 8     int t=0;//t代表是否进位
 9     for(int i=0;i<A.size()||i<B.size();i++)
10     {
11         if(i<A.size())t+=A[i];
12         if(i<B.size())t+=B[i];
13         res.push_back(t%10);
14         t=t/10;
15     }
16     if(t) res.push_back(1);//这里需要明白如果两个数相加最后一位还是进位了需要输出他
17     return res;
18 }
19 int main()
20 {
21     string a,b;
22     cin>>a>>b;
23     vector<int>A,B;
24     for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');//逆序存入
25     for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
26     auto C=add(A,B);//auto 会优先匹配C是什么类型
27     for(int i=C.size()-1;i>=0;i--) cout<<C[i]; 倒叙输出
28     return 0;
29 }

然后我们再讲一下大数相减。同样模拟的是小学的运算法则。

#include<iostream>
#include<vector>
using namespace std;
bool cmp(vector<int>&A,vector<int>&B)//比较函数
{
    if(A.size()!=B.size())return A.size()>B.size();位数不同贼输出较长的那个数组
    else{
        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>res;
    for(int i=0,t=0;i<A.size();i++)//这里的t同样代表进位C=A-B-t;
    {
        t=A[i]-t; //此处模拟的就是减法的运算法则
        if(i<B.size())t=t-B[i];
        res.push_back((t+10)%10);
        if(t<0)t=1;
        else t=0;
    }
    while(res.size()>1&&res.back()==0)res.pop_back();
    return res;
}
int main()
{
    string a,b;
    cin>>a>>b;
    vector<int>A,B,C;
    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');
    if(cmp(A,B))//这里需要比较A和B的大小,如果A大那么就正常减
    {
         C=sub(A,B);
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    }
    else{
         C=sub(B,A);//如果B大那么就要先输出一个-号,改成B-A就行 A-B=-(B-A)就是这个道理
        cout<<"-"<<endl;
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    }
    return 0;
}

 

posted @ 2020-02-19 02:45  想拿牌想考研的菜鸡  阅读(382)  评论(0编辑  收藏  举报