gpt4 book ai didi

c++ - 有没有优化两个BigNums的乘法的好方法?

转载 作者:行者123 更新时间:2023-12-01 14:34:41 24 4
gpt4 key购买 nike

我有一个类BigNum :

struct BigNum{
vector <int> digits;

BigNum(vector <int> data){
for(int item : data){d.push_back(item);}
}

int get_digit(size_t index){
return (index >= d.size() ? 0 : d[index]);
}
};
我正在尝试编写代码将两个相乘 BigNum s。目前,我一直在使用传统的乘法方法,即将第一个数字乘以另一个数字的每个数字,然后将其添加到运行总数中。这是我的代码:
BigNum add(BigNum a, BigNum b){ // traditional adding: goes digit by digit and keeps a "carry" variable
vector <int> ret;

int carry = 0;
for(size_t i = 0; i < max(a.digits.size(), b.digits.size()); ++i){
int curr = a.get_digit(i) + b.get_digit(i) + carry;

ret.push_back(curr%10);
carry = curr/10;
}

// leftover from carrying values
while(carry != 0){
ret.push_back(carry%10);
carry /= 10;
}

return BigNum(ret);
}

BigNum mult(BigNum a, BigNum b){
BigNum ret({0});

for(size_t i = 0; i < a.d.size(); ++i){
vector <int> row(i, 0); // account for the zeroes at the end of each row

int carry = 0;
for(size_t j = 0; j < b.d.size(); ++j){
int curr = a.d[i] * b.d[j] + carry;

row.push_back(curr%10);
carry = curr/10;
}

while(carry != 0){ // leftover from carrying
row.push_back(carry%10);
carry /= 10;
}

ret = add(ret, BigNum(row)); // add the current row to our running sum
}

return ret;
}
这段代码仍然运行得很慢;计算 1000 的阶乘大约需要一分钟。有没有更好的方法来乘以两个 BigNums?如果没有,是否有更好的方法来表示可以加速此代码的大数?

最佳答案

如果你使用不同的基数,比如 2^16 而不是 10,乘法会快得多。

但是以十进制打印会更长。

关于c++ - 有没有优化两个BigNums的乘法的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62441306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com