C++ 乘大数
问题是将大数字相乘 我使用的基数是10^9,当数字达到时会出现问题 十分之一。在下面的示例中,我使用了一个小得多的基础 简单C++ 乘大数,c++,pow,bigint,C++,Pow,Bigint,问题是将大数字相乘 我使用的基数是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
#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;
}
#包括
#包括
使用名称空间std;
型矢量放大;
const int base=1000;
放大倍数(放大倍数a、放大倍数b){
大c(a.尺寸()+b.尺寸());
对于(大小i=0;i 1和c.back()=0)
c、 向后弹出();
返回c;
}
int main(){
拉根a={100};
大结果=乘(a,a);
对于(int i=result.size()-1;i>=0;i--){
cout这就是为什么我们需要一个最小的、完整的、可验证的例子。一旦我们有了这个例子,我们可以看到问题与乘法无关。事实上,问题是这样的:
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i];
}
for(int i=result.size()-1;i>=0;i--){
cout=0;i--){
cout Check使用像这个bigint库这样已经实现的解决方案更容易,而不是乘以1LL
,我将静态转换为long-long。如果有进位,我将在内部循环之外声明carry
,并检查它是否为非零afterwards。这可能会为您节省后面的比较循环。当然,这些都不能解释为什么答案是错误的。将基数设为100(因为你可以在头脑中进行这些计算),然后在调试器中逐步完成。我们可以有一个
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i] << '#'
}