在某次实弹射击训练中,班长将十个战士围成一圈发子弹,首先,班长给第一个战士10颗,第二个战士2颗,第三个战士8颗,第四个战士22颗,第五个战士16颗,第六个战士4颗,第七个战士10颗,第八个战士6颗,第九个战士14颗,第十个战士20颗,然后按如下方法将每个战士手中的子弹进行调整,所有的战士检查自己手中的子弹数,如果子弹数为奇数,则向班长再要一颗,然后每个战士再同时将自己手中的子弹分一半给下一个战士(第10个战士将手中的子弹分一半给第一个战士)。问需要多少次调整后,每个战士手中的子弹数都相等?每个人各有多少颗子弹?
要求:输出每轮调整后战士手中的子弹数。
要求结果的输出格式为
0 10 2 8 22 16 4 10 6 14 20 各战士手中原始的子弹数
1 xx xxxxxxxxxxxxxxxxxx第1轮各战士手中的子弹数
2 xx xxxxxxxxxxxxxxxxxx第2轮各战士手中的子弹数
……
n xx xxxxxxxxxxxxxxxxxx最后一轮各战士手中的子弹数(应该相等)
个人的代码如下:
#include <iostream>
using namespace std;
void main()
{
//初始化数组
const int size = 10;
int arr[size] = {10,2,8,22,16,4,10,6,14,20};
int n = 1;
cout<<0<<" ";
for (int ix = 0;ix != size;++ix)
{
cout<<arr[ix]<<" ";
}
cout<<"各战士手中原始的子弹数"<<endl;
//判断各个战士子弹数是否一样
while (arr[0]!=arr[1]
||arr[1]!=arr[2]
||arr[2]!=arr[3]
||arr[3]!=arr[4]
||arr[4]!=arr[5]
||arr[5]!=arr[6]
||arr[6]!=arr[7]
||arr[7]!=arr[9]
||arr[8]!=arr[9])
{
//如果是奇数,再拿一颗子弹
for (int ix = 0;ix != size;++ix)
{
if (arr[ix]%2 != 0)
arr[ix] += 1;
}
//先保存最后一个人的子弹数的一半
int temp1 = arr[9]/2;
for (int ix = size-1;ix != -1;--ix)
{
//从最后一个人递减开始交换
if (ix != 0)
{
int temp2 = 0;
arr[ix] /=2;
temp2 = arr[ix-1]/2;
arr[ix] +=temp2;
}
//交换第一个人
else
{
arr[0] /= 2;
arr[0] +=temp1 ;
}
}
cout<<n<<" ";
for (int ix = 0;ix != size;++ix)
{
cout<<arr[ix]<<" ";
}
cout<<"第"<<n<<"轮各战士手中的子弹数"<<endl;
n++;
}
//各个战士子弹数已经一样
cout<<n-1<<" ";
for (int ix = 0;ix != size;++ix)
{
cout<<arr[ix]<<" ";
}
cout<<"最后一轮各战士手中的子弹数"<<endl;
}
应该还有优化的方法或者bug,闲下来再看看。