Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 乘大数_C++_Pow_Bigint - Fatal编程技术网

C++ 乘大数

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

问题是将大数字相乘

我使用的基数是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;
}
#包括
#包括
使用名称空间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] << '#'
    }