我试图通过重复加法将两个数字数组相乘。所以数字 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。Result = 648 --> 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;
}

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

最佳答案

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

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 的唯一更改必须是,当您从 input1nextResult 分配它时。

当您开始添加时,您的 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 条件的“......未完成......”部分有关。

这里有几个可能的优化,其中我不想说太多,因为这肯定是你功课的一部分。也许您应该继续构建一些代码,直到它工作为止。在此过程中,您可能已经有了如何使事情变得更容易的想法。如果您尝试在纸上执行添加步骤,它也可能有所帮助。您可能会注意到哪些部分可以更轻松地完成。 (如果您没有找到优化,请不要担心 - 这需要练习,有时大脑处于这种情绪状态,有时则不会。此外,您的结果必须是正确的,它们不应该被“巧妙地优化”然后有时是错误的。 )

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

您需要区分变量和它们所引用的对象。
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 不同。

10-06 14:12