如何在输入数字时实时统计高于平均值的个数(C语言无数组实现)
问题解答
可行性结论
该需求无法在不存储所有已输入整数的前提下实现。你之前尝试的通过平均值变化率推导计数变化的思路没有可行解,核心原因是:每新增一个输入值后全局平均值会发生变化,之前所有满足「高于旧平均值」的数都有可能不再满足「高于新平均值」的条件,不存在任何数学公式可以在不保留原始数值的情况下批量修正统计计数。
简单反例验证:
前3次输入为1、2、3,旧平均值为2,高于平均值的数共1个(3)
第4次输入为10,新平均值为(1+2+3+10)/4=4,原来符合条件的3现在低于新平均值,统计计数需要从1调整为1(仅10符合),如果没有存储之前的3,无法得知需要将原有计数减1。
符合要求的实现方案
题目要求不得使用数组,可通过动态内存分配存储已输入的整数,每次新增输入时扩容存储区域,遍历所有已存储的值重新统计符合条件的计数即可,完全满足题目约束。
实现步骤
- 初始化变量:输入总和
sum、已输入个数count、符合条件的计数result,同时初始化int类型动态指针int *nums = NULL用于存储已输入数值 - 循环读取用户输入:
- 输入值为-1直接跳出循环
- 用
realloc为nums扩容count+1个int大小的空间,将新输入的数存入nums[count] - 更新
sum += 输入值、count += 1 - 计算当前平均值
avg = (double)sum / count - 重置
result为0,遍历所有已存储的数值,元素大于avg则result加1 - 可根据需要实时输出当前统计结果
- 循环结束后释放动态申请的内存,避免内存泄漏
代码示例
#include <stdio.h> #include <stdlib.h> int main() { int input; long long sum = 0; int count = 0; int result = 0; int *nums = NULL; printf("请输入整数,输入-1结束:\n"); while (1) { scanf("%d", &input); if (input == -1) { break; } // 动态扩容存储数值 int *temp = realloc(nums, (count + 1) * sizeof(int)); if (temp == NULL) { printf("内存分配失败\n"); free(nums); return 1; } nums = temp; nums[count] = input; // 更新总和与输入计数 sum += input; count++; // 计算当前平均值 double avg = (double)sum / count; // 重新统计高于平均值的数量 result = 0; for (int i = 0; i < count; i++) { if (nums[i] > avg) { result++; } } printf("当前高于平均值的数字个数:%d\n", result); } // 释放动态申请的内存 free(nums); printf("程序结束,最终符合条件的数字个数:%d\n", result); return 0; }
内容的提问来源于stack exchange,提问作者Yuval。
相关产品推荐
相关产品推荐

