对于这种类似于OJ的问题,输入和输出不能含有多余的字符,否则提交就会不通过,要严格按照题目要求进行输入和输出。
这题求平均值,题目没有结束输入的条件(标记),该条件一般有多种形式,例如可以输入某个值结束输入(例如-1),或者先输入一个 n ,然后再用循环输入 n 个数。在这里就使用输入 -1 结束输入来编写代码。
整个题目的思路还是比较清晰。
先求全班人数和平均值,再求高的人数和平均值,再求低的人数和平均值。
这里需要注意最后一行的提示,如果平均值是一个整数,应该输出一个整数,例如平均值为 98.00,则应该输出 98,否则保留两位小数输出。
细节方面就是输入数据的问题。例如如果输入 -1,则人数、平均值全为 0。如果输入的分数都相同,则所有人都大于或等于全部平均分,此时低于全班平均分的人数为 0,根据求平均值公式(平均分=总分÷人数),此时出现除数为 0 的情况。
声明一个数组(整型、浮点型都行)用来保存输入的分数。
在输入分数的同时可以累计班级总分和班级人数。
根据班级总分和班级人数求班级平均分。
再循环遍历数组,把高于平均分或低于平均分和相应的人数和分数统计出来。
再求出这两批的平均分。
最后输出数据。
#include <stdio.h>
int main()
{
int a[1000] = {0}, L = 0, mid = 0, R = 0;
float sum = 0, Lsum = 0, Rsum = 0;
float Laver = 0, aver = 0, Raver = 0;
while (a[mid] != -1)
{
sum += a[mid];
scanf("%d", &a[++mid]);
}
if (mid > 1) aver = sum / --mid;
else --mid;
for (int i = 1; i <= mid; i++)
{
if (a[i] < aver)
{
R++;
Rsum += a[i];
}
}
Lsum = sum - Rsum;
L = mid - R;
if (L > 0) Laver = Lsum / L;
if (R > 0) Raver = Rsum / R;
printf("%d ", mid);
if (aver == (int)aver) printf("%.f\n", aver);
else printf("%.2f\n", aver);
printf("%d ", L);
if (Laver == (int)Laver) printf("%.f\n", Laver);
else printf("%.2f\n", Laver);
printf("%d ", R);
if (Raver == (int)Raver) printf("%.f\n", Raver);
else printf("%.2f\n", Raver);
return 0;
}
这题可以完全用数学来解决。能用数学解决的,最好用数学来解决,运行速度快。
变量 a 表示 0 ~ 6,也代表星期一 ~ 星期日。
变量 n 是后面的有 n 天。
a + 1 + n,其实就是总的天数,除以 7 的结果就是有多少周,1 周有一个星期五,所以除以 7 的结果就是能上机的次数。但是考虑到有余数的问题,如果余数是 5 或 6,说明还有一次上机的机会。
声明变量和输入数据。
int sum = a + 1 + n 求得总的天数。
int cnt = sum / 7 求得上机的次数。
if (sum % 7 >= 5) cnt++,求是否还有一次上机的机会。
输出结果。
#include <stdio.h>
int main()
{
int a, n;
scanf("%d %d", &a, &n);
int sum = a + 1 + n;
int cnt = sum / 7;
if (sum % 7 >= 5) cnt++;
printf("%d", cnt);
return 0;
}