问题描述
5-3 计算平均值 (50分)
现在为若干组整数分别计算平均值。 已知这些整数的绝对值都小于100,每组整数的数量不少于1个,不大于20个。 输入格式:首先输入K(不小于2,不大于20)。接下来每一行输入一组数据(至少有一组数据),每组至少有一个数据,在有多个数据时,两个数据之间有1到3个空格。最后一行输入100,标志输入的结束。 输出格式:对于每一组数据,输出其前K个数据的均值,如果该组数据个数少于K时,则输出该组所有数据的均值。输出的均值只输出整数部分,直接忽略小数部分。 样例输入: 3 10 30 20 40 -10 17 10 10 9 100 样例输出: 20 5 9 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:east 单位:福州大学
解题思路
因为数据很小,所以不需要做什么优化。
其实题目的重点就在于如何读入数据以及如何将读入的数据处理成令人愉悦的形式,另外还有一些需要注意的小地方,如负数的判断、均值个数的判断等。
关于如何读入数据,可以用gets或fgets将数据作为字符串整行读进来,要注意的是以下第一个数据K后的回车也会被读入,所以要多读一次。不过因为gets不太安全,所以新标准C11中把它抛弃了。。VS中gets被预处理为gets_s,用法为gets_s(变量名,size)。或者改用fgets也可以。fgets用法为fgets(变量名,size,文件),如果是控制台中的,文件就用stdin。
关于如何处理读入的数据,其实处理字符串的问题平时就经常碰到,而且这次的计算器中也有类似的,就是在栈运算中要把表达式的数字单独挑出来。我用的方法,是在判断当当前字符的ASCLL码值介于'0'与'9'之间时,进行循环累加,部分代码如下:
while ((c[i] >= '0') && (c[i] <= '9')){ t = 10 * t + c[i] - '0'; i++;}
关于负数的判断,其实不需要对负数和正数进行分类,只要设置一个初始值为1的变量,在进入数字判时,对其前一位的符号进行判断。如果是负数,则将变量值设为-1,否则不变,最后再与筛出来的数相乘就行。
还有就是需要求均值的个数要注意一下。
代码
#include#include using namespace std;int main(){ int i, j, k, n, m, s, t, a[30]; char c[1000]; cin >> n; fgets(c, 1000, stdin); while (1 > 0) { fgets(c, 1000, stdin); j = -1; i = 0; while (i < strlen(c)) { if ((c[i] >= '0') && (c[i] <= '9')) { m = 1; if (c[i - 1] == '-') m = -1; t = 0; while ((c[i] >= '0') && (c[i] <= '9')) { t = 10 * t + c[i] - '0'; i++; } j++; a[j] = t*m; } i++; } if ((j == 0) && (a[0] == 100)) break; j++; s = 0; if (j > n) { for (i = 0; i < n; i++) s += a[i]; cout << s / n << endl; } else { for (i = 0; i < j; i++) s += a[i]; cout << s / j << endl; } } return 0;}
如果还有其他需要,那再补充。