我只是在这里展示相关内容。
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;
}
答案 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)
我也不够聪明,但它在我看来,在你的功能中,你首先拿走模块,然后尝试携带一个已经摆脱的数字......我想:/