乘以大数
Multiplying big numbers
问题是大数相乘。
我使用的是 10^9 的基数,当数字达到
十分之一。在下面的示例中,我使用了一个小得多的基数
简单。
#include <iostream>
#include <vector>
using namespace std;
typedef vector<long long> largen;
const int base = 1000;
largen multiply(largen a, largen b) {
largen c(a.size() + b.size());
for (size_t i = 0; i<a.size(); ++i)
for (size_t j = 0, carry = 0; j < (int)b.size() || carry; ++j) {
long long cur = c[i + j] + a[i] * 1ll * (j < (int)b.size() ? b[j] : 0) + carry;
carry = (long long)(cur / base);
c[i + j] = (long long)(cur % base);
}
while (c.size() > 1 && c.back() == 0)
c.pop_back();
return c;
}
int main() {
largen a = {100};
largen result = multiply(a, a);
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i];
}
return 0;
}
预期答案“10000”,实际答案“100”
所以这就是为什么我们需要一个最小的、完整的、可验证的例子。一旦我们有了它,我们就可以看到问题是与乘法无关。事实上问题出在以下几行:
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i];
}
如果您将其更改为:
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i] << '#'
}
输出从(不正确的)“100”变为更有趣的“10#0#”。第二个数字显示为单个数字零,而不是三个零。使用 setw
和填充以确保除第一个数字外的所有数字都用零填充。
问题是大数相乘。
我使用的是 10^9 的基数,当数字达到 十分之一。在下面的示例中,我使用了一个小得多的基数 简单。
#include <iostream>
#include <vector>
using namespace std;
typedef vector<long long> largen;
const int base = 1000;
largen multiply(largen a, largen b) {
largen c(a.size() + b.size());
for (size_t i = 0; i<a.size(); ++i)
for (size_t j = 0, carry = 0; j < (int)b.size() || carry; ++j) {
long long cur = c[i + j] + a[i] * 1ll * (j < (int)b.size() ? b[j] : 0) + carry;
carry = (long long)(cur / base);
c[i + j] = (long long)(cur % base);
}
while (c.size() > 1 && c.back() == 0)
c.pop_back();
return c;
}
int main() {
largen a = {100};
largen result = multiply(a, a);
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i];
}
return 0;
}
预期答案“10000”,实际答案“100”
所以这就是为什么我们需要一个最小的、完整的、可验证的例子。一旦我们有了它,我们就可以看到问题是与乘法无关。事实上问题出在以下几行:
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i];
}
如果您将其更改为:
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i] << '#'
}
输出从(不正确的)“100”变为更有趣的“10#0#”。第二个数字显示为单个数字零,而不是三个零。使用 setw
和填充以确保除第一个数字外的所有数字都用零填充。