最大乘数问题

(一) 题目要求

首先输入的是数组的个数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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值