题解 | #最大乘积#
最大乘积
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 数据类型,而且在取值时,必须强转换,这里我也不是很懂,之前以为大数据类型接收小数据类型应该不需要强制转换的,一直整不出来。这个我也是用其他代码测试出来的
#悬赏#