十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?
*问题分析与算法设计
*问题分析与算法设计
题目描述的分糖过程是一个机械的重复过程,编程算法完全可以按照描述的过程进行模拟。
#include <stdio.h>
void print(int s[]);
int judge(int c[]);
int j = 0;
int main()
{
static int sweet[10] = {10, 2, 8, 22, 16, 4, 10, 6, 14, 20};
int i, t[10], l;
printf(" child\n");
printf(" round 1 2 3 4 5 6 7 8 9 10\n");
printf("------------------------------------------\n");
print(sweet);
while (judge(sweet))
{
for (i = 0; i < 10; i++)
if(0 == sweet[i]%2)
{
t[i] = sweet[i] = sweet[i]/2;
}
else
{
t[i] = sweet[i] = (sweet[i] + 1)/2;
}
for (l = 0; l < 9; l++)
sweet[l + 1] = sweet[l + 1] + t[l];
sweet[0] += t[9];
print(sweet);
}
return 0;
}
int judge(int c[])
{
int i;
for (i = 0; i < 10; i++)
if(c[0] != c[i])
{
return 1;
}
return 0;
}
void print(int s[])
{
int k;
printf(" %2d ", j++);
for (k = 0; k < 10; k++)
printf("%4d", s[k]);
printf("\n");
}