解题思路:
1.根据题目给的数据范围先定义一个大小为101的数组,用于存放小朋友的糖果数。count定义为老师需要补发的糖数,初始为0,flag为判断是否所有小朋友糖数都相等的标志,初始时不相等,flag=0。
2.依次输入N,以及其他数据,把a[0]看成一个类似缓冲区的东西,暂时储存数据。a[i]为第i个小朋友。
3.首先假设flag初始为0,即现在每人糖数不相等,需要进行以下操作进行重新分配。(即使现在糖数相同时 以下的操作也不影响目前的每个人的糖数,因为在每人都相等的情况下,无论进行多少次分配都不会改变数据。) 。
4. 游戏开始,让缓冲区存放第一个小朋友的,循环语句,依次将前n-1个小朋友的糖果传一半给前一个人 , 由于大家坐成一个圈,所以第n个小朋友把自己的一半去掉之后同时又得到第一个小朋友糖数的一半(即缓冲区的数目)。
5. 进行一轮游戏后,用一个循环依次检查是否是奇数,并同时统计老师补发糖的数量。
6. 最后判断是否每个人糖数是否相等,如果糖数都相等,flag=1,此时while(!flag)跳出循环,游戏结束。如果糖数不相等,继续游戏。
注意事项:
1.缓冲区存放的是第一个小朋友的一半糖果,别忘了加给最后一个小朋友。
2.从第一个小朋友到第N-1个,传递糖果时都符合a[i]=a[i]/2+a[i+1]/2,第N个需要单独加上a[0](缓冲区的数据)。
3.用循环判断是否是奇数时,如果是奇数,需要在这个数据上加1,同时也不要忘了count++。
4.判断每个小朋友的糖果数目是否相等时,可以用循环语句判断从2-N个小朋友是否都跟第一个小朋友相等,如果不相等,提前flag=0,游戏还没结束,如果都相等,flag=1,游戏结束。
参考代码:
#include<stdio.h>
int main()
{
int a[101],n,i,count=0,flag=0;//定义数组,用来储存小朋友的糖数,count定义为老师需要补发的糖数,初始为0,flag为判断是否所有小朋友糖数都相等的标志。
scanf("%d",&n);//输入N,小朋友的个数。
a[0]=0;//把a[0]定义为一个类似于缓冲区的东西,用于暂时的存放数据。
for(i=1;i<=n;i++)
scanf("%d",&a[i]);//为方便起见,把a[i]直接就看成第i个小朋友 。
while(!flag)//flag初始为0,即现在每人糖数不相等,需要进行以下操作进行重新分配。(即使现在糖数相同时 以下的操作也不影响目前的每个人的糖数,因为在每人都相等的情况下,无论进行多少次分配都不会改变数据。)
{
a[0]=a[1]/2;//缓冲区存放第一个小朋友的
for(i=1;i<n;i++)
a[i]=a[i]/2+a[i+1]/2;//用循环语句,依次将前n-1个小朋友的糖果传一半给前一个人
a[n]=a[n]/2+a[0];//由于大家坐成一个圈,所以第n个小朋友把自己的一半去掉之后同时又得到第一个小朋友糖数的一半(即缓冲区的数目)
for(i=1;i<=n;i++)
{
if(a[i]%2!=0){a[i]=a[i]+1;count++;
}
} //用一个循环一次检查是否是奇数,并同时统计老师补发糖的数量。
for(i=1;i<=n;i++)
{
if(a[i]==a[1])
flag=1;
else{flag=0;break;
}
} //判断是否每个人糖数是否相等,如果糖数都相等,flag=1,此时while(!flag)跳出循环,游戏结束。如果糖数不相等,继续游戏。
}
printf("%d",count);
return 0;
}
0.0分
0 人评分