算法:高精度运算

算法:高精度运算

高精度加法 A+B

A/B中存放的是大正整数的每一位,并且是倒序存放的 :如:"12345678" =====>[6,5,4,3,2,1]

// C = A + B
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;
}

高精度减法A-B

确保A>B

// 判断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;
}
//C=A-B
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;
}

高精度乘法 A*b

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

高精度除法A/b,A%b

// C=A/b
vector<int> div(vector<int> &A, int b, int &r)	//r代表余数
{
    vector<int> C;
    r = 0;
    for (int i = A.size(); i >= 0; i--)
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(), C.end());	//#include<algorithm>
    while (C.size() > 1 && C.back() == 0)	//去除前导0
        C.pop_back();
    return C;
}
posted @ 2020-09-19 22:28  trafalgar999  阅读(161)  评论(0编辑  收藏  举报