📜  如何在C ++中存储大量超过100位的数字(1)

📅  最后修改于: 2023-12-03 15:24:27.131000             🧑  作者: Mango

如何在C++中存储大量超过100位的数字

在C++中,内置的基本数据类型是intfloatdouble等,它们都有自己的大小限制。当我们需要存储超过100位的数字时,我们需要使用自定义类型来实现。

1. 大数的存储方式

存储大数有两种常见的方式:

1.1 数组存储

可以使用一个数组来存储大数,每个数组元素存储一个数字位。例如,对于一个200位的数字,可以使用一个长度为200的整数数组来存储。

这种方法的优点是简单易懂,容易实现。缺点是占用空间较大,不太适合长时间运行。

1.2 字符串存储

可以使用一个字符串来存储大数。例如,对于一个200位的数字,可以使用一个长度为200的字符串来存储。

这种方法的优点是节省空间,适合长时间运行。缺点是需要写复杂的代码去实现。

2. 实现大数运算

实现了大数的存储方式后,我们需要实现一些基本的运算,例如加、减、乘、除等。

2.1 加法

加法需要从低位到高位逐位相加,并将进位加到高位。代码实现如下:

string add(string num1, string num2) {
    if (num1.length() < num2.length()) swap(num1, num2);
    int carry = 0, i = num1.length() - 1, j = num2.length() - 1;
    while (i >= 0 || j >= 0) {
        int x = i >= 0 ? num1[i--] - '0' : 0;
        int y = j >= 0 ? num2[j--] - '0' : 0;
        int sum = x + y + carry;
        carry = sum / 10;
        sum %= 10;
        num1[i + 1] = sum + '0';
    }
    if (carry) num1 = '1' + num1;
    return num1;
}
2.2 减法

减法需要从低位到高位逐位相减,并将借位从高位减去。代码实现如下:

string subtract(string num1, string num2) {
    if (num1.length() < num2.length()) swap(num1, num2);
    int borrow = 0, i = num1.length() - 1, j = num2.length() - 1;
    while (i >= 0 || j >= 0) {
        int x = i >= 0 ? num1[i--] - '0' : 0;
        int y = j >= 0 ? num2[j--] - '0' : 0;
        int diff = x - y - borrow;
        if (diff < 0) {
            diff += 10;
            borrow = 1;
        } else {
            borrow = 0;
        }
        num1[i + 1] = diff + '0';
    }
    while (num1.length() > 1 && num1[0] == '0') num1.erase(num1.begin());
    return num1;
}
2.3 乘法

乘法需要从低位到高位逐位相乘,并将进位加到高位。代码实现如下:

string multiply(string num1, string num2) {
    int m = num1.length(), n = num2.length();
    vector<int> ans(m + n);
    for (int i = m - 1; i >= 0; --i) {
        for (int j = n - 1; j >= 0; --j) {
            int product = (num1[i] - '0') * (num2[j] - '0');
            int p1 = i + j, p2 = i + j + 1;
            int sum = product + ans[p2];
            ans[p2] = sum % 10;
            ans[p1] += sum / 10;
        }
    }
    string result;
    for (int i = 0; i < ans.size(); ++i) {
        if (result.empty() && ans[i] == 0) continue;
        result.push_back(ans[i] + '0');
    }
    return result.empty() ? "0" : result;
}
2.4 除法

除法需要从高位到低位逐位相除,并将余数加到下一位。代码实现如下:

string divide(string dividend, int divisor) {
    string ans;
    int cur = 0;
    for (int i = 0; i < dividend.length(); ++i) {
        cur = cur * 10 + (dividend[i] - '0');
        ans += cur / divisor + '0';
        cur %= divisor;
    }
    while (ans.length() > 1 && ans[0] == '0') ans.erase(ans.begin());
    return ans;
}
3. 总结

通过上面的代码实现,我们可以很方便地存储和运算大数。当然,这里只是提供一种思路,并不是最优解。在实际的开发过程中,需要根据实际情况选择合适的方法。