C++大数运算(加减乘除)

这个博客详细介绍了如何使用C++实现大数之间的加法、减法、乘法和除法操作。加法和减法通过反转字符串并逐位计算实现,乘法采用卷积运算,除法则通过不断取模和除法运算完成。这些算法对于理解和实现大数运算非常有帮助。
摘要由CSDN通过智能技术生成

// C = A + B, A >= 0, B >= 0
string add(const string &A, const string &B)
{
    vector<int> a, b, c;
    for (auto iter = A.rbegin(); iter != A.rend(); iter++)
        a.push_back(*iter - '0');
    for (auto iter = B.rbegin() - 1; iter != B.rend(); iter++)
        b.push_back(*iter - '0');
    int t = 0;
    for (size_t 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);
    string C;
    for (auto iter = c.end() - 1; iter != c.begin() - 1; iter--)
        C.push_back(*iter + '0');
    return C;
}

// C = A - B, A >= 0, B >= 0
string sub(const string &A, const string &B)
{
    bool flag = A.size() < B.size(); //判断A<B?
    if (A.size() == B.size())
        flag = A < B;

    if (flag)
        return "-" + sub(B, A);
    else
    {
        vector<int> a, b, c;
        for (auto iter = A.end() - 1; iter != A.begin() - 1; iter--)
            a.push_back(*iter - '0');
        for (auto iter = B.end() - 1; iter != B.begin() - 1; iter--)
            b.push_back(*iter - '0');
        int t = 0;
        for (size_t i = 0; i < a.size(); i++)
        {
            t += a[i];
            if (i < b.size())
                t -= b[i];
            c.push_back((t + 10) % 10);
            t = t < 0 ? -1 : 0;
        }
        while (c.size() > 1 && c.back() == 0)
            c.pop_back();
        string C;
        for (auto iter = c.end() - 1; iter != c.begin() - 1; iter--)
            C.push_back(*iter + '0');
        return C;
    }
}

这里直接做的卷积运算,推荐用FFT速度更快

// C = A * B, A >= 0, B >= 0
string multiply(const string &A, const string &B) {       
        int L1=A.size(), L2=B.size();
        vector<int> s1,s2;
        for(int i = L1-1; i>=0; i--) s1.push_back(A[i]-'0');
        for(int i = L2-1; i>=0; i--) s2.push_back(B[i]-'0');

        vector<int> C(L1+L2,0);
        for(int i = 0; i<L1; i++){
            for(int j = 0; j<L2; j++){
                C[i+j] += s1[i]*s2[j];
            }
        }
        for (int i = 0, t = 0; i < C.size(); i ++ ) {
            t += C[i];
            C[i] = t % 10;
            t /= 10;
        }
        int k = C.size()-1;
        while(k && !C[k]) k--;

        string ans;
        for(int i = k; i >= 0; i--){
            ans += C[i] + '0';
        }
        
        return ans;
    }

除(大数除小数)

// A / b = C , A >= 0, b > 0
string div(const string &A,int b){
   vector<int> a, c;
    for (auto iter = A.begin(); iter != A.end(); iter++)
        a.push_back(*iter - '0');
    int r = 0;
    for (size_t i = 0; i < A.size(); i ++ )
    {
        r = r * 10 + a[i];
        c.push_back(r / b);
        r %= b;
    }
    while (c.size() > 1 && c.front() == 0) c.erase(c.begin());
    string C;
    for (auto iter = c.begin(); iter != c.end(); iter++)
        C.push_back(*iter + '0');
    return C;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值