分糖果
一、问题描述:
10个小孩围成一圈分糖果,老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块第6个小孩4块,第7个小孩10块,第8个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩:糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖块数一样多吗?每人各有多少块糖?
二、问题分析:
根据题意,10个小孩开始时所拥有的糖果数是不同的,但分糖的动作却是相同的,即“所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块”。因此,这是一个典型的可使用循环结构来解决的问题。
老师开始给每个小孩分配的糖果数作为循环的初始条件,“所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。”这个重复的动作作为循环体循环的结束条件为所有小孩手中的糖块数一样多。在循环体中,还需要判断糖块数的奇偶性,奇偶性不同,完成的操作也不相同,显然这需要使用一个选择结构来实现。
三、程序流程图:
四、代码实现
#include<stdio.h> void print(int a[]); int judge(int c[]); int j=0; int main() { int sweet[10]={10,2,8,22,16,4,10,6,14,20}; int i,t[10],l; printf("Child 1 2 3 4 5 6 7 8 9 10\n"); printf("................\n"); printf("time\n"); print(sweet); while(judge(sweet)) { for(i=0;i<10;i++) if(sweet[i]%2==0) 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+l]+t[l]; sweet[0]+=t[9]; print(sweet); } } int judge(int c[]) { int i; for(i=0;i<10;i++) if(c[0]!=c[i]) return 0; } void print(int s[]) { int k; printf(" %2d ",j++); for(k=0;k<10;k++) printf("%4d",s[k]); printf("\n"); }