任意3个数字的最大乘积
Maximum product of any 3 numbers
给定o文件中的n个数字,计算任意三个数字的最大乘积。不接受使用矢量或数组。文件中的数字(int)可以是负-正,甚至可以是零。
解决这个问题最简单的方法是什么?我在想一些可能的情况:当所有的数字都是正、负、零,但还有更多的情况,比如当有正和负在一起时,
我假设输入集至少包含4个整数(如果我们有3个整数,则解决方案是琐碎的…)
有几个案例值得关注:
- 2个或多个负整数,1个或2个正整数
- 2个或更多负整数,3个或更多正整数
- 所有正整数
- 1个负整数,3个或更多正整数
- 所有负整数
让我们考虑一下每种情况下的解决方案。在下面的讨论中,lowest
和greatest
都指整数上的公共总序:例如,在-5和-1中,-1是最大的。
- 通过将具有最高绝对值的2个负数(即它们的分钟数)与最高正数相乘,可以获得所需的输出。换句话说,结果是
lowest_negative*2nd_lowest_negative*greatest_positive
- 结果为
max(3rd_greatest_positive*2nd_greatest_positive, lowest_negative*2nd_lowest_negative)*greatest_positive
- 结果为
3rd_greatest_positive*2nd_greatest_positive*greatest_positive
- 与3相同
- 结果为
3rd_greatest_negative*2nd_greatest_negative*greatest_negative
从上面的例子中,你可以推导出一个普遍解决问题的公式(适用于3元素集以及负/正整数的任何配置):
result = max(max1*min1*min2, max1*max2*max3)
其中,
max1
是输入的最大值,max2
是第二大元素,max3
是第三大元素,并且min1
和min2
是最低的两个元素。
现在,您可以很容易地编写一个程序来跟踪2个最小元素和3个最大元素(不管它们的符号如何!),然后返回max(max1*min1*min2, max1*max2*max3)
这里有一个C++演示(使用向量),只是为了演示公式的准确性。我把I/O处理留给你做练习。
这是一个相当数学化的问题。
在不试图证明的情况下,我的想法是取绝对值最大的数字,同时寻找偶数的负数来产生正数。
可以有负数和正数,也可以发生所有数字都是负数的情况,因此您必须考虑所有可能的情况:
最大的产品可以由。。。
+++ 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个结果,然后取最大的一个。
解决这个问题最简单的方法是什么?
野蛮的力量。
计算N中3个数字的所有乘积,选择3个时间,然后取最大值。
你的投入有多大?您可以使用记忆(动态编程)方法重用2个数字的乘积。
找到两个最大的数字和两个最小的数字,还有一个第三大的数字,如果第三个数字是正数,则返回它和具有最大乘积的对,如果是负数,则返回其和具有最小乘积的对。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- C++通过数字比较两个数字
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 如果我不知道每个列表中有多少个数字,我如何将给定数量的数字列表作为输入?
- 获取 2 个数字之间的差异百分比
- 在 txt 文件中显示前两个数字的程序
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 两个数字的对称配对功能
- 将最多 50 位数字的 2 个数字相乘
- 查找中间两个数字的正则表达式的匹配项
- 使用C++具有两个数字的最短路径算法.(C++)
- 使用三个数字比较器进行排序
- 在 CPP 中交换 2 个数字
- 将两个数字添加为链表
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 在 C++ 中查找 2 个数字的 GCD
- 代码以查找数组中的最大数字,但它仅将第一个数字显示为最大数字. 有人请告诉我为什么