很有趣的一道编程题,子弹分发问题
在某次实弹射击训练中,班长将十个战士围成一圈发子弹,首先,班长给第一个战士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,闲下来再看看。