问题是要增加大数字。
我使用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;
}
预期答案&#34; 10000&#34;,实际答案&#34; 100&#34;
答案 0 :(得分:0)
因此,这就是我们要求最小,完整,可验证的例子的原因。一旦我们有了这个,我们可以看到问题是 nothing 与乘法有关。事实上,问题在于:
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
和填充以确保除第一个数字之外的所有数字都填零。