题目
从标准输入读入 n 个整数,求出这批数据的最大值、最小值以及平均值(保留两位小数)。
输入格式:第一行输入整数个数 n;第二行输入 n 个整数,以空格分隔。
输出格式:在一行中按 max=最大值 min=最小值 avg=平均值 的格式输出,平均值保留两位小数,末尾换行。
数据范围与约定:1 ≤ n ≤ 105,元素绝对值不超过 105。
思路与算法
1. 单次遍历流式处理
读入第一个数字初始化 maxv = minv = x,累加和 sum = x。后续数字在读入的同时实时与最值比较并累加,只需 O(n) 时间与 O(1) 辅助空间。
2. 浮点精度除法
平均值计算需先将整型 sum 转换为浮点型(如 sum * 1.0 / n),避免发生整数截断除法;使用 %.2f 保留两位小数。
完整程序
#include <stdio.h>
int main(void)
{
int n;
if (scanf("%d", &n) != 1 || n < 1) {
return 1;
}
int x, maxv, minv;
long long sum = 0;
// 先读入第 1 个数,作为极值的初始基准
scanf("%d", &x);
maxv = minv = x;
sum = x;
// 读入后续数字并动态更新最大值、最小值与累加和
for (int i = 1; i < n; i++) {
scanf("%d", &x);
if (x > maxv) maxv = x;
if (x < minv) minv = x;
sum += x;
}
// sum * 1.0 转换为浮点除法,保留 2 位小数
printf("max=%d min=%d avg=%.2f\n", maxv, minv, sum * 1.0 / n);
return 0;
}运行示例
输入:
4
3 1 4 2输出:
max=4 min=1 avg=2.50