题目
有N个人参加100米短跑比赛, 跑道为8条。程序的任务是按照尽量使每组的人数相差最少的原则分组。
例如:
N=8时,分成1组:8人即可。
N=9时,分成2组:一组5人,一组4人。
N=25时,分4组:7、6、6、6。
请编程计算分组数字, 要求从键盘输入一个正整数(1~100之间, 不必考虑输入错误的情况)表示参赛的人数。
程序输出每个组的人数, 从大到小顺序输出, 每个数字一行。
分析
根据举的例子不难分析, 当人数超过8时分两组, 超过16时分三组, 超过24时分四组。。。
分组数应该是和人数除以8的结果有关。
确定分组数之后, 按照每组人数相差最少来分组,5 4, 7 6 6, 大概可以看出来个所以然(* ̄m ̄)
分组数
当人数被8整除时, 分组数为n/8
当人数不被8整除时, 分组数为n/8+1
即:
// 计算分组数
int zu = num/arr+(num%arr!=0);
上吧for!
#include <stdio.h>
int main()
{
// 人数 跑道数
int num, arr = 8;
scanf("%d", &num);
// 计算分组数
int zu = num/arr+(num%arr!=0);
// 计算每组人数
int shu = num/zu;
// 输出每组人数
for(int i=0; i<zu; i++)
{
// 前几组人数+1
if(i<num%zu)
printf("%d\n", shu+1);
else
printf("%d\n", shu);
}
}
解析zzz
重点在最后输出的for/if里, 根据规则:
- 当人数是8的倍数时, 每组人数是n/zu是毋庸置疑的
- 当人数不是8的倍数是, 前几组人数是n/zu+1, 后几组人数是n/zu