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

2025-06-24 01:43:33
推荐回答(3个)
回答1:

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

#include
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]);
}

回答2:

将自己手中的子弹分一半给下一个战士是同时进行的,我的做法如下:
#include
void main()
{
int a[10]={10,2,8,22,16,4,10,6,14,20};
int i,n=0,t=1;
int b[10];

while(t)
{
for(i=0;i<10;i++)
{
if(a[i]%2!=0)
a[i]++;
b[i]=a[i]/2;
}
for(i=0;i<10;i++)
a[i]=b[i]+b[(i+9)%10];
n++;
t=0;
for(i=0;i<10;i++)
{
if(a[i]!=a[(i+9)%10])
t=1;
}
}
printf("%d %d\n",n,a[0]);
getch();
}
运行输出为: 17 18
应该是正确的。

回答3:

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