问一个C语言的题目,C高手请进!

来源:百度知道 编辑:UC知道 时间:2024/05/31 01:31:05
在某次实弹射击训练中,班长将十个战士围成一圈发子弹。首先,班长给第一个战士10颗,第二个战士2颗,第三个战士8颗,第四个战士22颗,第五个战士16颗,第六个战士4颗,第七个战士10颗,第八个战士6颗,第九个战士14颗,第十个战士20颗。然后按如下方法将每个战士手中的子弹进行调整:所有的战士检查自己手中的子弹数,如果子弹数为奇数,则向班长再要一颗。然后每个战士再同时将自己手中的子弹分一半给下一个战士(第10 个战士将手中的子弹分一半给第1个战士)。问需要多少次调整后,每个战士手中的子弹数都相等?每人各有多少颗子弹?

我的做法是
#include<stdio.h>
main()
{
int a[10]={10,2,8,22,16,4,10,6,14,20},i,j=0,x=1;
while(x)
{
for(i=0;i<9;i++)
{
x=1;
if(a[i]!=a[i+1]) break;
else
x=0;
}
if(x)
{
for(i=0;i<9;i++)
{
if(a[i]%2!=0)
a[i]++;
a[i]/=2;
a[i+1]+=a[i];
}
if(a[i]%2!=0) a[i]++;
a[i]/=2;
a[0]+=a[i];
j++;
}

}
printf("%d %d\n",

同时分一半,是可以实现
结果是:调整17次后,每人的子弹数为18.

#include <stdio.h>
main()
{
int a[10] = {10,2,8,22,16,4,10,6,14,20};
int b[10];
int i;
int flag; /*标志子弹数是否已全相等,1为相等,0为不相等*/
int num = 1; /*表示调整次数*/
while(1)
{
for(i=0;i<10;i++)
{
if(a[i]%2!=0)a[i]+=1;
}
for(i=0;i<10;i++)
{
b[i] = a[i] = a[i]/2;
}
a[0]+=b[9];
for(i=0;i<9;i++)
{
a[i+1]+=b[i];
}

flag = 1;
for(i=0;i<9;i++)
{
if(a[i]!=a[i+1])
{
num++;
flag = 0;
break;
}
}
if(flag == 1)break; /*如果相等,跳出循环*/
}
printf("after do %d times, the num of bullets is same, and everyone has %d\n",num,a[0]);
}

第10个给第一个,这个你没实现,你只写了a[i]和a[i+1],那么i=9时,i+1就是10了,数组下标越界.应该用i和(i+1)%10,或者把a[9]到a[0]单独处理.

将自己手中的子弹分一半给下一个战士是同时进行