解题思路:
注意到数字的取值为[-10000,10000],则最小乘积应当分类讨论:
1、数据全为非负数,如 1、2、3、4、5,最小乘积为最小的两数相乘 1 * 2 = 2;(数据0也一样处理)
2、数据全为非正数,如 -5、-4、-3、-2、-1,最小乘积为最大的两数相乘 -2 * -1 = 2;(数据0也一样处理)
3、数据有正数,也有负数,如 -3、-2、-1、1、2,最小乘积为最小值与最大值乘积 -3 * 2 = -6。
综上,只要得到输入数据的最大值max1、次大值max2、最小值min1、次小值min2,再分类讨论输出结果即可。
注意事项:
max1、max2、min1、min2的初始化。
参考代码:
#include<stdio.h> int main() { int i, n, num, min1, min2, max1, max2; while (scanf("%d", &n) != EOF) { // 初始化min1、min2、max1、max2 scanf("%d%d", &min1, &min2); if (min1 > min2){ int t = min1; min1 = min2; min2 = t; } // min1成为最小值,min2为次小值 max1 = min2; // max1为最大值 max2 = min1; // max2为次大值 for (i = 2; i < n; i++) { scanf("%d", &num); if (num > max1) { // 若num大于最大值max1 max2 = max1; // max2成为次大值 max1 = num; // max1更新 } else if (num > max2) { // 若num只比max2大 max2 = num; // 直接更新max2 } else if (num < min1) { // 若num小于最小值min1 min2 = min1; // min2始终为次小 min1 = num; // min1更新,为最小 } else if (num < min2) { // 若仅比min2小 min2 = num; // 更新次小值 } } if (max1 <= 0) // 数据都为非正数 printf("%d\n", max1 * max2); // 最小乘积为最大的两个相乘 else if (min1 >= 0) // 数据都为非负数 printf("%d\n", min1 * min2); // 最小乘积为最小的两个相乘 else // 数据有负数也有正数 printf("%d\n", min1 * max1); // 最小乘积为最大的正数 * 最小负数 } return 0; }
0.0分
1 人评分
成绩转换 (C语言代码)浏览:1048 |
C语言程序设计教程(第三版)课后习题5.7 (Java代码)浏览:910 |
C语言训练-大、小写问题 (C语言代码)浏览:792 |
WU-蓝桥杯算法提高VIP-交换Easy (C++代码)浏览:1186 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C语言代码)浏览:761 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:268 |
永远的丰碑 (C语言代码)浏览:608 |
找出最长的字符串来 (C语言代码)浏览:1840 |
母牛的故事 (C语言代码)浏览:625 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1207 |