高精度

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

读取

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)

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

原文链接: https://www.cnblogs.com/mpmp/p/17063025.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    高精度

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/313326

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 下午12:46
下一篇 2023年2月16日 下午12:46

相关推荐