分糖果(C语言)

问题描述
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入样例
3
2 2 4
输出样例
4

解题思路

1、判断每个孩子的糖果数目是否相等,如果相等,则程序不执行
2、刚开始每个孩子要给出一半的糖果,由于初始糖果都是偶数,全体除以2
3、将要分出一半的糖果分给左边的小伙伴,即全体小朋友接收来自左边朋友的 一半糖果,注意,序号为最后一个小孩分配给第一个小孩时要借助变量分配
4、判断此时谁的糖果数是奇数,则老师分配给这个小孩

代码实现

#include
int main()
{  
 int a[100];
 int n,i,flag,temp,sum=0;
 scanf("%d",&n);
 for(i=0;i<n;i++)
  scanf("%d",&a[i]);
 while(1){                //判断条件
  for(i=0;i<n;i++)     //判断每个孩子的初始糖果数是否相等
  {
   if(a[0]!=a[i])   
   {
    flag=1;      //如果不相等,跳出此层循环
    break;
   }
   else
    flag=0;       
  }
  
  if(flag==0)  break;   //如果相等,则这个程序不执行
  
  for(i=0;i<n;i++)
  {
   a[i]=a[i]/2;      //刚开始每个孩子的糖果数都要分一半
  }  
   temp=a[n-1];           //将a[n-1]保存到temp变量中
  for(i=n-1;i>0;i--)
  {
   a[i]=a[i]+a[i-1];   //将每个孩子初始糖果的一半分给左边的孩子,注意,此时循环结束的最后一个式子是a[1]=a[1]+a[0]
                       //此时a[0]并没有拿到a[n-1]分来的糖果
  }
   
  a[0]=temp+a[0];        //此时将a[n-1]的一半糖果分到a[0]
  for(i=0;i<n;i++)
  {  
   if(a[i]%2==1)      //如果孩子的糖果数是奇数,则老师分配一个糖果,变成偶数个糖果
   {
    a[i]++;
       sum++;        //记录老师分配的糖果数
   }
  }
 }
 printf("%d\n",sum);      //输出
 return 0; 
}

你可能感兴趣的:(分糖果(C语言))