分糖果
问题描述
十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块 第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块 然后所有的小孩同时将手中的糖分一半给右边的小孩,糖块数为奇数的人 可向老师要一块,问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?
问题分析
根据题意,十个小孩开始时所拥有的糖果数是不同的,但分糖的动作却是相同的,即所有的小孩同时将手中的糖分一半给右边的小孩,糖块数为奇数的人可向老师要一块,因此这是一个典型的可使用循环结构来解决的问题
算法设计
使用数组来存放老师开始给每个小孩分配的糖果数,因为有十个小孩,故定义一个长度为10的整型数组
在循环过程中,糖果每经过一次重新分配,就打印输出一次,直到最后一次打印时,十个小孩所拥有的
糖果数都相同,此时结束循环
#include <stdio.h>
void print(int s[]);
int judge(int c[]);
int j = 0; /* !<记录糖果分配次数 */
int main(void)
{
int sweet[10] = {10, 2, 8, 22, 16, 4, 10, 6, 14, 20}; /* !< 初始化数组数据*/
int i, t[10], a;
printf("child 1 2 3 4 5 6 7 8 9 10
");
printf("..........................
");
printf("time
");
print(sweet); /* !<输出每个孩子手中糖果的块数*/
while (judge(sweet)) { /* !<若不满足要求则继续进行循环*/
/* !<将每个孩子手中的糖果分成一半*/
for (i = 0; i < 10; i++) {
if (sweet[i] % 2 == 0) { /* !<若为偶数则直接分出一半*/
t[i] = sweet[i] = sweet[i] / 2;
}
else { /* !<若为奇数则加1后再分出一半 */
t[i] = sweet[i] = (sweet[i]+1) / 2;
}
}
/* !<将分出的一半糖果给右边的孩子 */
for (a = 0; a < 9; a++) {
sweet[a+1] = sweet[a+1] + t[a];
}
sweet[0] += t[9];
print(sweet); /* !<输出当前每个孩子手中的糖果数 */
}
}
/* !<判断每个孩子手中的糖果数是否相同 */
int judge(int c[])
{
int i;
for (i= 0; i < 10; i++) {
if (c[0] != c[i]) {
return 1; /*不相同返回1*/
}
}
return 0; /*相同返回0*/
}
/* !<输出数组中每个元素的值*/
void print(int s[])
{
int k;
printf("%2d", j++);
for (k = 0; k < 10; k++) {
printf("%4d", s[k]);
}
printf("
");
}
/* !<output */
child 1 2 3 4 5 6 7 8 9 10
..........................
time
0 10 2 8 22 16 4 10 6 14 20
1 15 6 5 15 19 10 7 8 10 17
2 17 11 6 11 18 15 9 8 9 14
3 16 15 9 9 15 17 13 9 9 12
4 14 16 13 10 13 17 16 12 10 11
5 13 15 15 12 12 16 17 14 11 11
6 13 15 16 14 12 14 17 16 13 12
7 13 15 16 15 13 13 16 17 15 13
8 14 15 16 16 15 14 15 17 17 15
9 15 15 16 16 16 15 15 17 18 17
10 17 16 16 16 16 16 16 17 18 18
11 18 17 16 16 16 16 16 17 18 18
12 18 18 17 16 16 16 16 17 18 18
13 18 18 18 17 16 16 16 17 18 18
14 18 18 18 18 17 16 16 17 18 18
15 18 18 18 18 18 17 16 17 18 18
16 18 18 18 18 18 18 17 17 18 18
17 18 18 18 18 18 18 18 18 18 18
Process returned 0 (0x0) execution time : 0.013 s
Press any key to continue.