通过重复添加进行乘法运算

时间:2015-05-25 04:15:54

标签: java arrays

我试图通过重复添加来乘以两个数字数组。所以数字324 = [4,2,3]乘以24 = [4,2]。我坚持的是迭代添加324和324,将其保存到数组中[8,4,6]然后重复添加过程以获得[8,4,6] + [4,2,3]等这就是我到目前为止所做的:

BigInt result = new BigInt();
BigInt temp = new BigInt();
int sum = 0;
int carry = 0;
int size = digitList.size();
int k = 0; //k is our multiplier 
for (int i = otherBigInt.digitList.size()-1; i >=0; i--) {
    k = 10 * k + otherBigInt.digitList.get(i);
}

这是我逐位执行长时间添加的地方。

for (int i =0; i<size;i++) {
    sum = digitList.get(i) + digitList.get(i) + carry;
    if (sum > 9) {
        temp.digitList.add(sum%10);
        carry=1;
    } else {
        temp.digitList.add(sum);
        carry=0;
    }
    if (sum > 9 && i == size-1) {
        temp.digitList.add(sum/10);
    }
}

这是我被卡住的地方。我在这里要做的是将324添加到临时数组,然后将其答案分配给结果数组。从这里我将结果分配给临时数组,以便我可以添加到存储的结果。例如:digitlist = 324,temp = 324.结果= 648 - &gt; digitList = 324,temp = 648. result = 972。

我清除了结果数组,因此每次迭代都可以存储更新的结果。此时我得到一个nullpointerExeption,其中index = 0,size = 0。

for(int i=0;i<25;i++) {
    result.digitList.clear();
    for (int j=0; j<digitList.size();j++) {
        sum = digitList.get(j) + temp.digitList.get(j) + carry;
        if (sum > 9) {
            result.digitList.add(sum%10);
            carry=1;
        } else {
            result.digitList.add(sum);
            carry=0;
        }
        if (sum > 9 && j == size-1) {
            result.digitList.add(sum/10);
        }
    }
    temp.digitList = result.digitList;
    }
    return result;
}

这是一个家庭作业问题,但我已经坚持了一段时间。我要来的解决方案对于这么简单的任务来说似乎太复杂了,有人可以引导我朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:2)

如果您使用其他变量名来帮助您,可能会更容易:

BigInt input1 = new BigInt();
BigInt multiplier = new BigInt();

BigInt nextResult = new BigInt();
BigInt lastResult = null;

while ( ... notdone ... ) {
    nextResult.digitList.clear();
    if (lastResult==null) {
        lastResult = input1;
    } else {
        ... the addition logic: nextResult = lastResult + input1 ...
    }
    ... the logic to remember that one addition step was done ...

    lastResult = nextResult;
    nextResult = new BigInt();
}

lastResult始终是上一次迭代的结果。你必须小心,你永远不会改变lastResult中的数字。当您从lastResultinput1分配时,nextResult的唯一更改必须是。

当你开始添加时,你的lastResult没有数据,因为没有“最后一次迭代”。在这种情况下,您只需使用lastResult初始化input1

nextResult是您在添加迭代中工作并将新数字存储到的位置。完成该迭代后,将其设为lastResult并准备一个新的nextResult。 (在您的代码中,您有时使用temp,有时使用result,这会给您带来混乱。)

有趣的是,记住你已经计算了多远。例如,在第一次迭代后使用“5 x 3”得到结果,“3”变为“2”,因为剩下两次迭代。或者使用“123 x 15”时,“15”逐渐减少,每次迭代首先变为“14”,然后是“13”,......“10”,“9”,...... a.s.o。

这与while条件中的“...... not done ...”部分有关。

这里有一些可能的优化,我不想多说,因为这肯定是你作业的一部分。可能你应该继续构建一些代码直到它工作。一路走来,你可能已经有了如何让事情变得简单的想法。如果您尝试在纸上执行添加步骤,它也可能会有所帮助。您可能会注意到哪些部分可以更容易地完成。 (如果你没有找到优化,不要担心 - 这需要练习,有时大脑处于这种情绪中,有时候不是。你的结果必须是正确的,它们不应该“巧妙地优化”,然后有时是错误的。 )

更新:关于变量和对象实例

您需要在变量和它们引用的对象之间做出改变。

nextResult = new BigInt();

此陈述意味着两件事:1)您创建BigInt()的实例和2)您使用lastResult引用BigInt。

现在声明:

lastResult = nextResult;

这仍然是BigInt,但现在lastResultnextResult都指的是同一个BigInt。如果更改lastResult中的数字,则实际更改BigInt实例中的数字。由于nextResultlastResult引用相同的BigInt,因此在获取数字时,两者都会传递相同的值。

这也意味着您不需要复制数字。他们已经在那里了。

现在,此语句创建了BigInt的新实例:

nextResult = new BigInt();

现在,在这三个陈述之后,nextResult引用了一个新的BigInt实例,该实例现在与BigInt中的lastResult不同。