gpt4 book ai didi

c++ - 乘以表示为数组的整数

转载 作者:太空宇宙 更新时间:2023-11-04 13:54:58 24 4
gpt4 key购买 nike

我正在尝试构建一个类 bigint,它表示数组中的大数,但我在创建 *= 时遇到问题将此 bigint 与另一个 bigint 相乘的成员函数。我知道已经有一些类(class)可以实现这一点,但我正在尝试建立自己的类(class)作为学习练习。

biguint 的数字存储在数组std::size_t data[CAPACITY] 中最低有效数字存储在 data[0] 中和 data[CAPACITY-1] 中的最高有效数字(小端)。例如,如果 CAPACITY=5 , 那么 12345 将表示为 data[0]=5, data[1]=4, data[2]=3, data[3]=2, data[4]=1 .

我已成功构建构造函数、加法函数、大小函数,<<运算符函数,>>运算符函数,和 []运算符函数。例如,以下代码有效。

int main()
{
biguint b(423);
biguint c(2363);
b += c;
cout << b << endl;
cout << b.size() << endl;

return 0;
}

这将输出:

2786
4

关于乘法问题,这是我想出的最接近的函数。它可以正确计算像 400*2 这样的双数但在像 400*20 这样的双数时失败,因为它重写了 data[i]。 .

void bigint::operator *= (const bigint &n)
{
int carryover = 0;
for (size_t i=0; i < size(); ++i)
{
for (size_t j=0; j < n.size(); ++j)
{
std::cout << data[i] << "*" << n[j] << "=";
data[i] *= n[j];
std::cout << data[i] << std::endl;
}
}
}

我正在尝试像这样进行长乘法运算:

  109
* 12
____
218
+1090
_____
1308

我认为正确的方法是创建一个新的 bigint,但我得到了错误,lvalue required as left operand of assignment ,当我尝试这样的事情时:

void bigint::operator *= (const biguint &n)
{
int carryover = 0;
bigint ans(0);
for (size_t i=0; i < size(); ++i)
{
for (size_t j=0; j < n.size(); ++j)
{
ans[j] += data[i] * n[i];
ans[j] += carryover;
carryover = ans[j] / 10;
ans[j] = ans[j] % 10;
}
}
}

我做错了什么?我的方法至少是正确的吗?将存储为小端数组的两个数字相乘的正确方法是什么?

作为引用,这就是我对 += 进行编码的方式运算符(operator)。我基本上只是在手工做小学加法。

void bigint::operator += (const biguint &n)
{
int carryover = 0;
for (size_t i=0; i < CAPACITY; ++i)
{
data[i] += n[i];
data[i] += carryover;
carryover = data[i] / 10;
data[i] = data[i] % 10;
}
}

最佳答案

我解决了这个问题,但速度缓慢且效率低下。我只是将第一个数字添加到它自己的第二个次数。我的语法有点奇怪,因为我没有写 <, >, or ++运营商呢。我现在将坚持使用这个实现,因为它是我目前唯一可用的实现。

void biguint::operator *= (const biguint &n)
{
biguint temp(*this);
biguint i(1);
biguint one(1);

while (i.compare(n) != 0)
{
*this += temp;
i += one;
}
}

关于c++ - 乘以表示为数组的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21923950/

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