我正在尝试构建一个类bigint,它代表一个数组中的大数字但是我在创建一个*=
成员函数时遇到了麻烦,该函数将这个bigint与另一个bigint相乘。我知道已经有一些课程可以实现这一目标,但我正在努力建立自己的课程。
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这样的bigints,但是因为它重写data[i]
而在400 * 20之类的bigints中失败。
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;
}
}
}
我做错了什么?我的方法至少是正确的吗?将两个数字相乘作为小端数组的正确方法是什么?
作为参考,这就是我对+=
运算符进行编码的方式。我基本上只是手工做小学。
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;
}
}
答案 0 :(得分:0)
我以缓慢而低效的方式解决了这个问题。我只是将第一个数字添加到第二个数字。我的语法有点奇怪,因为我还没有编写<, >, 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;
}
}