解题思路:
    

        注意到数字的取值为[-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.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论