乘以表示为数组的整数

时间:2014-02-21 02:17:03

标签: c++ arrays class endianness multiplication

我正在尝试构建一个类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;
    }
}

1 个答案:

答案 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;
    }
}