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