在HugeInteger类中实现乘法功能

时间:2014-09-20 03:01:10

标签: c++ arrays loops biginteger

我只是在这里展示相关内容。

HEADER FILE:

class HugeInteger
{
private:

static const int MAXDIGITS = 4;
int digits[MAXDIGITS];

public:

HugeInteger multiply(HugeInteger) const;
}

实现:

HugeInteger::multiply(HugeInteger op2) const
{

HugeInteger product, temp;

for(int numberB = MAXDIGITS -1, counter = 0; numberB >= 0; numberB--, counter++)
{
    int carry = 0;
    for(int numberA = MAXDIGITS -1; numberA >= 0; numberA--)
    {
        temp.digits[numberA-counter] = (op2.digits[numberB] * digits[numberA] + carry)%10;
        if(temp.digits[numberA-counter] >= 10)
        {
            carry = temp.digits[numberA-counter] / 10;
        }
        else
        {
            carry = 0;
        }
    }
    product = product + temp;
}
return product;
}

并且输出功能如下所示:

void HugeInteger::output()
{
    for(int i=0; i<MAXDIGITS; i++)
    {
        cout << digits[i];
    }
}

现在这看起来有效,但事实并非如此。我快到了,但我无法到达那里。我已经在这个单一功能上工作了20多个小时,但我认为我不够聪明,无法解决这个问题。三次重新开始但是无法让它工作。

我正在尝试使用由数组组成的 HugeInteger 来实现乘法功能。

编辑:这个(改变了模数的位置)以相同的结果结束。

HugeInteger HugeInteger::multiply(HugeInteger op2) const

{     HugeInteger产品,temp;

for(int numberB = MAXDIGITS -1, counter = 0; numberB >= 0; numberB--, counter++)
{
    int carry = 0;
    for(int numberA = MAXDIGITS -1; numberA >= 0; numberA--)
    {
        temp.digits[numberA-counter] = op2.digits[numberB] * digits[numberA] + carry;
        if(temp.digits[numberA-counter] >= 10)
        {
            carry = temp.digits[numberA-counter] / 10;
            temp.digits[numberA-counter] %= 10;
        }
        else
        {
            carry = 0;
        }
    }
    product = product + temp;
}
return product;

}

3 个答案:

答案 0 :(得分:0)

当您生成进位时,您还需要获取计算数字的模数。

答案 1 :(得分:0)

通常最好让它非常清楚地知道你正在做什么。

通过将数字移动到加法函数中,可以使乘法函数更清晰。在不处理计数器的情况下,它清楚地表明该函数只是执行经典的长乘法。

//Add op2 to this.digits, but shift op2 by some amount of digits
//(The same thing as multiplying by 10^shift)
HugeInteger HugeInteger::add(HugeInteger op2, int shift) const{
    int carry = 0;
    HugeInteger ret = *this;
    for( int place = MAXDIGITS - 1; place >= 0; --place ){
        int value = carry;
        if( place >= 0 ){
            value += digits[place];
        }
        if( place + shift >= 0 && place + shift < MAXDIGITS ){
            value += op2.digits[place + shift];
        }

        ret.digits[place] = value % 10;
        carry = value / 10;
    }
    return ret;
}

HugeInteger HugeInteger::multiply(HugeInteger op2) const
{
    HugeInteger product, temp;
    int shift = 0;
    for(int numberB = MAXDIGITS - 1; numberB >= 0; numberB--)
    {
        int carry = 0;
        for(int numberA = MAXDIGITS -1; numberA >= 0; numberA--)
        {
            temp.digits[numberA] = op2.digits[numberB] * digits[numberA] + carry;
            if(temp.digits[numberA] >= 10)
            {
                carry = temp.digits[numberA] / 10;
                temp.digits[numberA] %= 10;
            }
            else
            {
                carry = 0;
            }
        }
        product = product.add(temp, shift++);
    }
    return product;

}

答案 2 :(得分:-1)

我也不够聪明,但它在我看来,在你的功能中,你首先拿走模块,然后尝试携带一个已经摆脱的数字......我想:/