高精度运算

===

Index

大整数加法

求两个不超过200位非负整数的和

// s = "123234", t = "32313342";
// ans = 32436576
string sum(string s, string t) {
    reverse(s.begin(), s.end());
    reverse(t.begin(), t.end());
    int n = s.size(), m = t.size(), carry = 0, i = 0;
    string ans;

    while (i < n || i < m || carry) {
        int a = i >= n ? 0 : s[i] - '0', b  =  i >= m ? 0 : t[i] - '0'; 
        int sm = a + b + carry;
        carry = sm / 10;
        ans += (sm % 10) + '0';
        i++;
    }
    reverse(ans.begin(), ans.end());
    return ans;
}

大整数减法

s = “32436576”, t = “32313342”; ans = “123234”,

string sub(string s, string t) {
    reverse(s.begin(), s.end());
    reverse(t.begin(), t.end());
    int n = s.size(), m = t.size();
    string ans;
    for (int i = 0; i < n - 1; ++i) {
        if (s[i] < t[i]) {
            s[i + 1]--;
            s[i] = s[i] + 10;
        }
        ans += s[i] - t[i] + '0';
    }
    while(ans.size() && ans.back() == '0') ans.pop_back(); // 删除前导0
    reverse(ans.begin(), ans.end());
    return ans;
}

大整数乘法

leetcode 43

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

class Solution {
public:
    string multiply(string s, string t) {
        int n = s.size(), m = t.size();
        if (!n || !m) return "";
        if (s[0] == '0' || t[0] == '0') return "0";
        reverse(s.begin(), s.end()); 
        reverse(t.begin(), t.end()); 
        vector<int> res(n + m);
        int carry = 0;
        for (int i = 0; i < n; ++i) 
            for (int j = 0; j < m; ++j) 
                res[i + j] += (s[i] - '0') * (t[j] - '0');
        for (int i = 0; i < n + m; ++i) {
            int tmp = res[i] + carry;
            res[i] = tmp % 10;
            carry = tmp / 10;
        }
        if (carry) res[n + m - 1] = carry;
        int end = n + m -1;
        while(res[end] == 0) end--;
        string ans;
        for (int i = end; i >=0; i--) {
            ans += char(res[i] + '0');
        }
        return ans;
    }
};

大整数除法

问题描述

求两个大的正整数相除的商

输入数据

2 行,第 1 行是被除数,第 2 行是除数。

输出

一行输出是相应的整数商

解题思路

基本思想是反复做减法,如何能减的更快一些呢?以7546除以23为例来看一下:开始商为0,先减去 23 的 100 倍,就是 2300,发现够减 3 次,余下 646。于是商的值就增加 300。然后用 646 减去 230,发现够减 2 次,余下 186,于是商的值增加 20。最后用 186 减去 23,够减 8 次。因此最终商就是 328。 所以本题的核心是要写一个大整数的减法函数,然后反复调用该函数进行减法操作。 计算除数的 10 倍、100 倍的时候,不用做乘法,直接在除数后面补 0 即可。



打赏一下

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦