高精度

当计算位数超过最大存储范围时,无法正常存储而使用数组来存储数据

读取

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.putsh_back(b[i] - '0');

加法

不考虑AB为负数情况

vector<int> add(vector<int>& A, vector<int>& B)//取地址速度更快,避免复制占用时间
{
    if (A.size() > B.size()) return add(B, A); //始终保证A的长度大于等于B的长度

    vector<int> C; //存储答案
    int t = 0; //存储进位
    for (int i = 0; i < A.size(); i++)
    {
        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;
}

减法

这个模板前提是AB都为正数,当然也可以扩展为可以计算负数的情况,只需要对输入输出特殊处理

计算前需要先判断AB大小,如果 A-B<0 计算 b-aans=-(b-a)

//比较大小不是简单的比较两个size即可,还要考虑如果size相同的情况进行按位比较
bool cmp(vector<int>& A, vector<int>B)
{
    if (A.size() != B.size()) return A.size() > B.size();

    for (int i = 0; i < A.size(); i++)
        if (A[i] != B[i]) return A[i] > B[i];

    return true;//相等返回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); //如果t<0,t=t+10,如果t>=0,t=t
        //判断是否需要借位
        if (t < 0) t = 1;
        else t = 0;
    }

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

乘法

使用前提,一个很长的整数乘一个较小的整数

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;
    }

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

除法

使用前提,一个很长的整数除一个较小的整数

vector<int> div(vector<int>& A, int b, int& r) //A除b,余数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;
    }

    //存储时习惯低位在前,所以翻转C
    reverse(C.begin(), C.end());
    //处理前导零
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

posted @ 2023-01-20 18:57  咕噜噜冒泡  阅读(43)  评论(0)    收藏  举报