【发布时间】:2014-08-02 05:47:32
【问题描述】:
我正在解决一个问题,该问题涉及将整数数组作为用户的输入。该程序计算数组元素的乘积。计算如下:
例如,让输入为 56、61、2。然后程序首先执行56 * 61 = 3416,然后执行modulo 3416 with 199 = 33。现在取数组中的下一个元素,即 2,并将其乘以 33 = 66。结果将是 3416 + 33 = 3482。这是isotopes atom 的计算。
现在,如果我们可以重新排列数组的元素,即 61、2、56;我们可以得到最大的产品如下:
61 * 2 = 122
122 * 56 = 6832
6832 + 122 = 6954
我已经编写了一个程序,它可以简单地计算输入数组的乘积,但现在我想如上所述对数组进行排序。我的程序如下:
import java.util.*;
public class codevita1 {
public static void main (String []args) {
int num = 0;
try {
num = Integer.parseInt (args[0]);
} catch (Exception e) {
System.err.println ("Arguments not enough");
}
int arr[] = new int[num];
for (int i = 1; i <= num; i++) {
arr[i-1] = Integer.parseInt(args[i]);
}
new codevita1().calcEnery (arr);
}
private int calcEnergy (int elements[]) {
int energy = 0;
int t = 1;
for (int i = 0; i < elements.length; i++) {
if (i == 0) {
energy = (elements[i] * elements[++i]);
} else {
energy += (t * elements[i]);
}
t = energy % 199;
}
return energy;
}
}
我搜索了动态编程和分治算法,但我不明白哪种算法可以帮助我完成任务。请帮助我了解我应该使用哪种算法以及如何使用?
【问题讨论】:
-
你能稍微解释一下你的帖子中关于“现在如果我们可以重新排列数组的元素,即 61、2、56;我们可以实现最大乘积如下:”因为在这一行之前你已经有了“结果将是 3416 + 33 = 3482”
-
观察第一个结果之前的元素顺序,即56,61,2,观察第一个结果之后的元素顺序,即61,2,56。操作按顺序进行仅方式(如数组)。
-
您或许应该删除该算法的英文解释,因为我在一次阅读中无法理解它......你有
calcEnergy方法中的代码,我认为它是正确的,对于那些不真正了解 Java 的人来说似乎已经足够清楚了。因此,只需显示不同数字顺序的示例结果。或者在Java之外写伪代码。 -
也许我可以给出完整的定义,但它太长了,所以我已经尽力用最短的形式解释算法。 50%的工作已经完成;只是重点仍然是如何重新排列数组以实现元素的最大乘积。
-
我很确定您的 calcEnergy 公式不正确,因为我对每个排列都得到了相同的值。似乎在某处缺少模数,也许还有其他东西。根据后记代码的样子,我想到了一种可行的方法。
标签: java arrays algorithm sorting dynamic-programming