📅  最后修改于: 2023-12-03 15:24:27.131000             🧑  作者: Mango
在C++中,内置的基本数据类型是int
,float
,double
等,它们都有自己的大小限制。当我们需要存储超过100位的数字时,我们需要使用自定义类型来实现。
存储大数有两种常见的方式:
可以使用一个数组来存储大数,每个数组元素存储一个数字位。例如,对于一个200位的数字,可以使用一个长度为200的整数数组来存储。
这种方法的优点是简单易懂,容易实现。缺点是占用空间较大,不太适合长时间运行。
可以使用一个字符串来存储大数。例如,对于一个200位的数字,可以使用一个长度为200的字符串来存储。
这种方法的优点是节省空间,适合长时间运行。缺点是需要写复杂的代码去实现。
实现了大数的存储方式后,我们需要实现一些基本的运算,例如加、减、乘、除等。
加法需要从低位到高位逐位相加,并将进位加到高位。代码实现如下:
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;
}
减法需要从低位到高位逐位相减,并将借位从高位减去。代码实现如下:
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;
}
乘法需要从低位到高位逐位相乘,并将进位加到高位。代码实现如下:
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;
}
除法需要从高位到低位逐位相除,并将余数加到下一位。代码实现如下:
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;
}
通过上面的代码实现,我们可以很方便地存储和运算大数。当然,这里只是提供一种思路,并不是最优解。在实际的开发过程中,需要根据实际情况选择合适的方法。