题目:输入一些整数,求出它们的最大值、最小值和平均值(保留三位小数)。输入保证这些数都是不超过1000的整数。
要求:输入包含多组数据,每组数据第一行是整数个数n,第二行数n个整数。n=0为输入结束标志,程序应当忽略这组数据。相邻两组数据之间应输出一个空行。
样例输入:
8
2 8 3 5 1 7 3 6
4
-4 6 10 0
0
样例输出:
Situation 1 :1 8 4.375
Situation 2 :-4 10 3.000
#include <stdio.h>
#define NUM 1000000
int main()
{
int max, min, sum = 0, n, x, flag = 0;
double avg = 0; //定义平均数
while (scanf("%d",&n) == 1 && n) //打算输入n个整数的集合,0为输入结束标记
{
for (int i = 0; i < n; i++)
{
scanf("%d", &x); //一次输入整数
sum += x;
avg = (double)sum / n;
if (x < min)
{
min = x;
}
if (x > max)
{
max = x;
}
}
if(flag)
{
printf("\n");
}
printf("Case : %d %d %d %.2lf", ++flag, max, min, avg);
}
}
- 为什么这里scanf函数会有返回值呢?
当scanf函数无法再次读取n时,将返回0。
其实以上的代码还存在一些局限性,当你后面多次输入数据时,它的最小值、最大值、和都不对应。
3
1 2 3
Situation : 1 3 1 2.00
4
4 2 6 1
Situation : 2 6 1 4.75
解决方法:
在多数据的算法题中,计算完一组数据后某些变量没有重置,影响到下一组数据的结果。这些都是时间积累下来的,平时需要多多注意代码的完整性。
#include <stdio.h>
#define NUM 1000000000
int main()
{
int max, min, sum = 0, n, x, flag = 0;
double avg = 0; //定义平均数
while (scanf("%d",&n) == 1 && n) //打算输入n个整数的集合,0为输入结束标记
{
if(n <= 1000)
{
int sum = 0; //每次计数后 重新置零
max = -NUM; //每次计数后 重新置位
min = NUM;
for (int i = 0; i < n; i++)
{
scanf("%d", &x); //一次输入整数
sum += x;
avg = (double)sum / n;
if (x < min)
{
min = x;
}
if (x > max)
{
max = x;
}
}
if(flag)
{
printf("\n");
}
printf("Case : %d %d %d %.2lf", ++flag, max, min, avg);
}
else
{
return 0;
}
}
}