任意3个数字的最大乘积

时间:2016-07-21 12:03:40

标签: c++

给定来自o文件的n个数字计算我们可以用任意三个数字得到的最大乘积。 不接受使用向量或数组。 文件中的数字(int)可能是负数,也可能是零。

解决这个问题的最简单方法是什么? 我正在考虑一些可能的情况:当所有数字都是正数,负数,零时,但更多的是在有正面和负面的情况下一起

5 个答案:

答案 0 :(得分:2)

我假设输入集包含至少4个整数(如果我们有3个整数,则解决方案很简单......)。

有几个案例值得注意:

  1. 2个或更多负整数,1或2个正整数
  2. 2个或更多个负整数,3个或更多个正整数
  3. 所有正整数
  4. 1个负整数,3个或更多正整数
  5. 所有负整数
  6. 让我们考虑每种情况下的解决方案。在下面的讨论中,greatestlowest_negative*2nd_lowest_negative*greatest_positive都引用了整数的公共总顺序:例如,-5和-1,-1是最大的。

    1. 通过将2个负数乘以具有最高正数的最高绝对值(即它们的分钟)来获得所需的输出。换句话说,结果是max(3rd_greatest_positive*2nd_greatest_positive, lowest_negative*2nd_lowest_negative)*greatest_positive
    2. 结果为3rd_greatest_positive*2nd_greatest_positive*greatest_positive
    3. 结果为3rd_greatest_negative*2nd_greatest_negative*greatest_negative
    4. 与3相同。
    5. 结果为result = max(max1*min1*min2, max1*max2*max3)
    6. 根据上述情况,您可以推导出一个普遍解决问题的公式(适用于3个元素集以及任何负/正整数配置):

      max1
           

      其中max2是输入的最大值,max3是第二大元素,min1是第三大元素,min2max(max1*min1*min2, max1*max2*max3)是两者最低要素。

      现在你可以轻松编写一个程序来跟踪2个最小元素和3个最大元素(无论它们的符号如何!),然后返回{{1}}

      这是一个C++ demo(使用向量),只是为了证明公式的准确性。我把I / O处理作为练习留给你。

答案 1 :(得分:1)

这是一个相当数学的问题。

不试图证明我的想法是采用具有最大绝对值的数字,同时寻找偶数量的负数来产生正数。

答案 2 :(得分:1)

可能存在负数和正数,也可能发生所有数字都为负数,因此您必须考虑所有可能的情况:

最大的产品可以制成......

+++   all numbers positive  -> needs factors with large absolute value
++-   one negative          -> needs factors with small absolute value
+--   only one positive     -> needs factors with big ...
---   all negative          -> needs factors with small ...

由于你不能使用数组或向量,你可以这样做:

对于上述每种情况,您需要具有最大绝对值或最小绝对值的所有因子。您可以通过所有给定的数字,并为每个案例存储三个数字,这将成为本案例的最大产品。最后你只需要比较4个结果并选择最大的结果。

答案 3 :(得分:1)

  

解决这个问题最简单的方法是什么?

蛮力。

计算N中3个数字的所有产品选择3次,然后取最大值。

您的投入有多大?您可以使用memoizing(动态编程)方法重用2个数字的产品。

答案 4 :(得分:0)

找到两个最大的数字和两个最小的数字,也是第三个最大的数字,如果第三个数字是正数,则返回它和具有最大乘积的货币对,如果是负数则返回它和具有最小乘积的货币对。