分糖果游戏c语言程序设计,[蓝桥杯][2014年第五届真题]分糖果 (C语言代码)每一步都很详细,适合小白看。...

解题思路: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

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

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值