题解 | #最大乘积#

最大乘积

https://www.nowcoder.com/practice/5f29c72b1ae14d92b9c3fa03a037ac5f

#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);
    int data[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&data[i]);
    }
    if(n<3)
    {
        printf("该数组中无法找到三个数据\n");
        return 0;
    }
    int max1=0,max2=0,max3=0,min1=0,min2=0;
    max1=data[0];
    int temp,temp1,temp3;
    long long sum1=0,sum2=0;    //需要使用long long 类型
    if(data[1]>max1)    //确定第二大的数
    {
        max2=max1;
        max1=data[1];
    }
    else 
        max2=data[1];
    if(data[2]>max1)    //确定第三大的数
    {
        temp=max1;
        max1=data[2];
        max3=max2;
        max2=temp;
    }
    else if(data[2]>max2)
    {
        max3=max2;
        max2=data[2];
    }
    else max3=data[2];  //初始化最开始的三个数据完成

    if(n==3)
    {
        printf("%lld\n",(long long)max1*max2*max3);
        return 0;
    }

    //接下来遍历数组找出最大的三个数据和最小的两个数据
    for(int i=3;i<n;i++)
    {
        if(data[i]>max1)
        {
            temp=max1;
            max1=data[i];
            temp1=max2;
            max2=temp;      //第二大的接收原来第一大的
            temp3=max3;
            max3=temp1;     //第三大的接收原来第二大的
            if(min1==0)
                min1=temp3;
            if(min2==0)
                min2=temp3;
        }
        else if(data[i]>=max2)
        {
            temp=max2;
            max2=data[i];
            temp3=max3;
            max3=temp;
            if(min1==0)
                min1=temp3;
            if(min2==0)
                min2=temp3;
        }
        else if(data[i]>=max3)
        {
            temp=max3;
            max3=data[i];
            if(data[i]==0)  //这样接收可确保min1为最小的数
                min1=temp;
            if(min2==0)     //这样接收可确保min2为第二小的数
                min2=temp3;
             
        }
        else if(data[i]<=min1)   //此处有一个细节,因为初始化为0,经过前三个条件过后,min1中存下的必定是一个最小数
        {
            temp=min1;
            min1=data[i];
            if(temp<=min2)
                min2=temp;
        }
        else if(data[i]<min2)
        {
            min2=data[i];
        }
    }

    if(n==4)
    {
        sum1=(long long)max1*max2*max3;
        sum2=(long long)max1*max3*min1;
        printf("%lld\n",sum1>=sum2? sum1:sum2);
        return 0;
    }

    //循环结束后得到需要的数据
    sum1=(long long)max1*max2*max3;
    sum2=(long long)max1*min1*min2;
    //printf("%lld,%lld\n",sum1,sum2);
    if(sum1 >= sum2)
        printf("%lld\n",sum1);
    else
        printf("%lld\n",sum2);
    //printf("%d,%d,%d,%d,%d\n",max1,max2,max3,min1,min2);
    return 0;
}

注意:这里的量级超过万亿,需要使用long long 数据类型,而且在取值时,必须强转换,这里我也不是很懂,之前以为大数据类型接收小数据类型应该不需要强制转换的,一直整不出来。这个我也是用其他代码测试出来的

#悬赏#
全部评论
补充一下,在单独获取数据时,确实不需要强制转换,但这是乘积运算,极有可能溢出,因而需要
点赞
送花
回复
分享
发布于 2023-10-26 21:56 湖南

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务