在我的第一个答案中,我解决了 OP 的“将两个大数相乘”的问题。事实证明,这个愿望只是我现在要解决的更大问题的一小部分:
“我还没有达到我算法的最终框架,我想知道你是否可以帮助我解决这个问题。”
(问题描述见问题)
我要做的只是更详细地解释Amnon 提出的方法,所以所有的功劳都应该归功于他。
您必须从 2 的幂的整数列表中找到连续子列表的最大乘积。这个想法是:
- 计算每个连续子列表的乘积。
- 返回所有这些产品中最大的一个。
start
您可以通过其和end
索引来表示子列表。因为start=0
有 n-1 个可能的值end
,即 0..n-1。这将生成从索引 0 开始的所有子列表。在下一次迭代中,您递增start
1 并重复该过程(这一次,有 n-2 个可能的值end
)。这样您就可以生成所有可能的子列表。
现在,对于这些子列表中的每一个,您必须计算其元素的乘积——即提出一个方法computeProduct(List wholeList, int startIndex, int endIndex)
。您可以使用内置BigInteger
类(它应该能够处理您的作业提供的输入)来使您免于进一步的麻烦,或者尝试实现其他人描述的更有效的乘法方式。(我将从更简单的方法开始,因为它更容易查看您的算法是否正常工作,然后首先尝试优化它。)
现在您可以遍历所有子列表并计算其元素的乘积,确定具有最大乘积的子列表应该是最简单的部分。
如果您仍然难以在两个步骤之间建立联系,请告诉我们 - 但也请在您解决问题时向我们提供您的代码草稿,这样我们就不会最终逐步构建解决方案而您复制和粘贴它。
编辑:算法骨架
public BigInteger listingSublist(BigInteger[] biArray)
{
int start = 0;
int end = biArray.length-1;
BigInteger maximum;
for (int i = start; i <= end; i++)
{
for (int j = i; j <= end; j++)
{
//insert logic to determine the maximum product.
computeProduct(biArray, i, j);
}
}
return maximum;
}
public BigInteger computeProduct(BigInteger[] wholeList, int startIndex,
int endIndex)
{
//insert logic here to return
//wholeList[startIndex].multiply(wholeList[startIndex+1]).mul...(
// wholeList[endIndex]);
}