C语言:战士分子弹问题

来源:百度知道 编辑:UC知道 时间:2024/06/06 10:25:32
在某次实弹射击训练中,班长将10个战士围成一圈发子弹。
首先,班长给第一个战士10颗,第二个战士2颗,第三个战士8颗,第四个战士22颗,第五个战士16颗,第六个战士4颗,第七个战士10颗,第八个战士6颗,第九个战士14颗,第十个战士20颗。
然后按如下方法将每个战士手中的子弹进行调整:
所有的战士检查自己手中的子弹数,如果子弹数为奇数,则向班长再要一颗。然后每个战士再同时将自己手中的子弹分一半给下一个战士(第10个战士将手中的子弹分一半给第一个战士)。
问需要多少次调整后,每个战士手中的子弹数都相等?每人各有多少颗子弹?
要求输出每轮调整后各战士手中的子弹数。结果的输出格式为:
0 10 2 8 22 16 4 10 6 14 20
1 15 6 5 15 19 10 7 8 10 17
......
17 18 18 18 18 18 18 18 18 18 18 最后一轮各战士手中的子弹数(应相等)
算法提示:
为简单起见,在进行一轮分发时,可先判断每位战士的子弹数是否为偶数,若不是,则将这位战士的子弹数加1.
然后,再考虑每个战士将自己的子弹同时分一半给下一个战士,这样每个战士的子弹数将是他原来的子弹数和他的上一位战士的子弹数的平均数,如第二位战士的子弹数将是第一位战士的子弹数10和他本身的子弹数2的平均数6.第一位战士的子弹数将是第一位战士的子弹数10和最后一位战士的子弹数20的平均数即15,以此类推。
因此,这个题可使用双重循环,外层循环的结束条件是所有战士的子弹数相等,在循环中,先判断每位战士子弹数奇偶性并作相应处理,再用一个计数循环,对每位战士的子弹数循环赋值。
我不知道外层循环的结束条件判断所有战士的子弹数相等怎么写?

#include <stdio.h>

#define FIGHTER_NUM 10

int isequ(int bullet[]);
void isevennumber(int bullet[]);
void toallotbullet(int bullet[]);

void main()
{
int bullet[FIGHTER_NUM] = {10,2,8,22,16,4,10,6,14,20};

for ( ; !isequ(bullet) ; )/*判断是否相等*/
{
isevennumber(bullet);/*判断是否是奇数,是则加1*/

toallotbullet(bullet);/*分配子弹*/
}
}

int isequ(int bullet[])
{
int i;

for (i=1; i<FIGHTER_NUM; i++)
{
if (bullet[0] != bullet[i])
return 0;/*子弹数不相等返回0*/
}

return 1;/*子弹数相等返回1*/
}

void isevennumber(int bullet[])
{
int i;

for (i=0; i<FIGHTER_NUM; i++)
{
if (0 != bullet[i] % 2 )
bullet[i]++;/*为奇数则加1*/
}
}

void toallotbullet(int bullet[])
{
int i;
int allotbullet[10];/*临时数组*/

/*临时数组保存分配后的子弹数*/
allotbullet[0] = (bu