我试图通过重复添加来乘以两个数字数组。所以数字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;
}
这是一个家庭作业问题,但我已经坚持了一段时间。我要来的解决方案对于这么简单的任务来说似乎太复杂了,有人可以引导我朝着正确的方向前进吗?
答案 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
中的数字。当您从lastResult
或input1
分配时,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
,但现在lastResult
和nextResult
都指的是同一个BigInt
。如果更改lastResult
中的数字,则实际更改BigInt
实例中的数字。由于nextResult
和lastResult
引用相同的BigInt
,因此在获取数字时,两者都会传递相同的值。
这也意味着您不需要复制数字。他们已经在那里了。
现在,此语句创建了BigInt
的新实例:
nextResult = new BigInt();
现在,在这三个陈述之后,nextResult
引用了一个新的BigInt
实例,该实例现在与BigInt
中的lastResult
不同。