通过将数字乘以两个以上来消除数组的元素

时间:2013-07-30 09:32:58

标签: c++ arrays

我想将大小为n的整数数组消除为两个数,只需将两个数相乘即可。这两个数字(M1和M2)的条件是减去M1-M2的结果是其他可能情况中的较小值。 以下示例更详细地说明了该问题:

假设数组的大小为4,元素为[n1,n2,n3,n4]

可能的抵消是:

M1 = n1且 M2 = n2xn3xn4

M1 = n2且 M2 = n1xn3xn4

M1 = n3且 M2 = n1xn2xn4

M1 = n4且 M2 = n1xn2xn3

M1 = n1xn2且 M2 = n3xn4

M1 = n1xn3且 M2 = n2xn4

M1 = n1xn4且 M2 = n2xn3

M1 = n2xn3且 M2 = n1xn4

M1 = n2xn4且 M2 = n1xn3

M1 = n3xn4且 M2 = n1xn2

在这个例子中有十个可能的值 M1 M2 ,在我的问题中我想要它的正确值是ABS的最小值(其他九个值中的M1 - M2 )。它们有可能不止一个正确的答案(类似),但这可以忽略,我想要的输出是 M1 的一个值和 M2的一个值

注意:如果是在C ++中,我将不胜感激:)

提前致谢...

1 个答案:

答案 0 :(得分:1)

我会使用std::next_permutation来生成输入数组的所有排列,并且对于每个排列,您多次使用std::accumulate来创建不同的产品(即M1所在的一个产品只是排列的第一个元素,M2是其余的,一个产品M1是排列的前两个元素,M2是剩下的等等,直到你点击中间)。

这不是最佳选择,因为它会生成一些重复的产品,即它会使用[n1, n2, n3, n4]M1 = n1 * n2来处理排列M2 = n3 * n4,之后它会处理排列{{1} } [n2, n1, n4, 3]M1 = n2 * n1。解决方案非常简单易写,但它无法利用乘法是可交换的这一事实。