高精度“-”算法

一、高精度"-"算法

1.1 编写高精度"-",记住下面的内容,代码也就游刃有余了!

(1) 首先采用高精度"+"同样的处理方式来存储大整数

(2) 其次存储完,考虑如何运算?

二、高精度"-"算法的核心

2.1 大整数存储

• 无论是编写'+''-''*''/'哪一个,必须保证大整数的存储格式相同,因为很多时候不仅仅有一个符号的运算。

2.2 减法运算的本质

• 大整数相减:C=A3A2A1A0-B2B1B0,要分两种情况考虑,如果Ai-Bi-t够减,则最终的位数为Ai-Bi-t,如果不够减,最终的位数则为Ai-Bi-t+10,实际上就是(t+10)%10的两种情况。

2.3 另外我们要知道

(1) 学会判断处在数组中的两个大整数的大小,一般位数不同,长度更长的那个会更大些,如果位数相同,则从最高位比较,也就是数组的最后一位。

(2) 如果A大于等于B——>直接算,否则——>-(B-A)。

(3) 可能会出现前导零的情况,去除!

(4) 这里处理的是两个正整数,如果是负整数,一定可以转换位|A|+|B|或者|A|-|B|。

三、高精度"-"的代码模板

添加了注释

"""
bool cmp(vector<int> &A,vector<int> &B)//判断A是否大于等于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;
}
"""
}
// C = A - B, 满足A >= B, A >= 0, B >= 0
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);//分两种情况考虑,如果Ai-Bi-t够减,则最终的位数为Ai-Bi-t,如果不够减,最终的位数则为Ai-Bi-t+10
        if (t < 0) t = 1;
        else t = 0;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();//去掉前导零
    return C;
}

作者:yxc
链接:https://www.acwing.com/problem/content/794/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/lastk/p/12443379.html