给定来自o文件的n个数字计算我们可以用任意三个数字得到的最大乘积。 不接受使用向量或数组。 文件中的数字(int)可能是负数,也可能是零。
解决这个问题的最简单方法是什么? 我正在考虑一些可能的情况:当所有数字都是正数,负数,零时,但更多的是在有正面和负面的情况下一起
答案 0 :(得分:2)
我假设输入集包含至少4个整数(如果我们有3个整数,则解决方案很简单......)。
有几个案例值得注意:
让我们考虑每种情况下的解决方案。在下面的讨论中,greatest
和lowest_negative*2nd_lowest_negative*greatest_positive
都引用了整数的公共总顺序:例如,-5和-1,-1是最大的。
max(3rd_greatest_positive*2nd_greatest_positive, lowest_negative*2nd_lowest_negative)*greatest_positive
3rd_greatest_positive*2nd_greatest_positive*greatest_positive
3rd_greatest_negative*2nd_greatest_negative*greatest_negative
result = max(max1*min1*min2, max1*max2*max3)
根据上述情况,您可以推导出一个普遍解决问题的公式(适用于3个元素集以及任何负/正整数配置):
max1
其中
max2
是输入的最大值,max3
是第二大元素,min1
是第三大元素,min2
和max(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)
找到两个最大的数字和两个最小的数字,也是第三个最大的数字,如果第三个数字是正数,则返回它和具有最大乘积的货币对,如果是负数则返回它和具有最小乘积的货币对。