(一) 题目要求
首先输入的是数组的个数n,接着输入数组元素的值,求出该数列中三个数的乘积为最大的值。
(二) 基本思路
2.1 起初的想法
起初是想通过便利数组a[n],将所有的值取绝对值转化为正数,之后遍历数组三次找到其中最大的三个值,相乘得出结果,但是这样做是不对的。
1.数组是int型,但是测试数据中的结果超过了int型数据,这里必须用long long型数据才可以。
拓展:c语言中“int”型数据占4个字节(32位),“ long long”型数据占64位。long long result=int a*int b,是不行的,必须long long result=long long a * long long b。(这是测试数据在22%时出现的错误原因)
2.在便利数据取绝对值的过程中,正变负号单用“-”符号是不行的,这里可能是涉及到组成原理的内容,如果直接取“-”可能涉及到改变符号位的二进制值,导致符号改变,所以最好在编程中不要用“-”进行取反操作。
拓展:所以这种想法的取绝对值操作是不可行的,最好不要把负数变成正数去运行。(这是测试数据在71%时出现错误的原因)
2.2 正确的思路
1.不用数组实现,每输入一个数字temp,如果temp>0就对当前的前三大正数比较找到位置,如果temp<0就对当前的后两小数字进行比较,找到位置。
2.为什么要保留“前三大”和“后两小”呢?
因为题目规定了result=三个数相乘。无非就是两种情况:
(1)全为正,三个数当然是正数里面最大的。
(2)一正两负,三个数是最大的正数,和两个最小的负数。
(三) 源码代码
#include<iostream>
using namespace std;
int main()
{
int n;
long long f1=0,s2=0,t3=0,k1=0,k2=0,temp,result;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>temp;
if(temp>0)
{//正数前三大
if(temp>f1)
t3=s2,s2=f1,f1=temp;
else if(temp>s2)
t3=s2,s2=temp;
else if(temp>t3)
t3=temp;
}
else
{//负数后两小
if(temp<k1)
k2=k1,k1=temp;
else if(temp<k2)
k2=temp;
}
}
result=f1*s2*t3>f1*k1*k2?f1*s2*t3:f1*k1*k2;
cout<<result;
return 0;
}