题目

从标准输入读入 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