高精度减法 去除前导零 比较两个很大的正整数 取模的技巧 AcWing 792. 高精度减法

#include

using namespace std;

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;
    for(int i=0,t=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;
    cin>>a>>b;
    
    vector<int> 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;
}

高精度减法

输入输出和高精度加法基本一致

但是有一些细节还是需要注意

首先是减法需要借位,借位是向高位借一,当前位加十,用t表示是否借位,假设借位,t==1,假设不借位,t==0,假设a>b,所以我们直接做减法即可,t临时存储答案

t=A[i]-t表示的是,借位之后A[i]的大小,假设该位有B[i]存在,再减去B[i],如果答案小于0加上十,否则就是答案,把答案存进C数组
t { t + 10 ,   t < 0 t   t > = 0 t \begin{cases} t+10,\ &t<0 \\ t\ &t>=0 \\ \end{cases} t{t+10, t t<0t>=0
使用这一行代码可以实现上面的两种情况
(t+10)%10

cmp函数

首先比较数位,如果数位大,就表示数字大,因为两个数字都是正整数

数位相等的话,从高位开始比较,高位大的数字大,注意高位存在数组最后面

如果相等也返回真,因为我们要求的是不严格大于

去除前导零

只要数位大于1,数组的最后一位是0,表示的意思是有前导零,因为高位存在数组的后面,就进行pop_back()操作即可

判断输入两个数字的大小,如果b>a,就先输出一个负号,然后用B-A作为答案

你可能感兴趣的:(算法竞赛,#,acwing算法基础,算法,c++,数据结构)