很有趣的一道编程题,子弹分发问题

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



posted @ 2014-12-31 14:46  西安小陈  阅读(692)  评论(0编辑  收藏  举报