分糖果

 

一、问题描述

    10个小孩围成一圈分糖果,老师分给第1个小孩10块糖,第2个小孩2块,第3个小孩8块,第4给小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩,糖块数为奇数的人可以向老师要一块。问经过几次后大家手中的糖块数一样多,每人各有几块糖。

二、设计思路

    根据题意,10个小孩开始的时候拥有的糖果数是不同的,但分糖的动作是相同的,将手中的糖分一半给右边的小孩,糖块数为奇数的人可以向老师要一块。这即是算法的核心。

四、伪代码

while(糖果不同时)

{

将每个孩子的糖果分成一半

for()

将一半糖果分给右边的孩子

for
}

五、代码实现

#include<stdio.h>

void print(int s[]);

int judge(int c[]);

int j=0;

main()

{

       int sweet[10]={10,2,8,22,16,4,10,6,14,20};

       int i,t[10],l;

printf("child10,2,8,22,16,410,2,8,22,16,4,10,6,14,20,10,6,14,20\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+1]+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 1;

       }

       return 0;

}

void print(int s[])

{

       int k;

       printf("%2d",j++);

       for(k=0;k<10;k++)

              printf("%4d",s[k]);

       printf("\n");

}

posted @ 2023-04-25 13:21  八千里路云和月色  阅读(63)  评论(0)    收藏  举报