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


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



  • 相关阅读:
    事件对象
    事件
    父元素高度为auto,子元素使用top:-50%没有效果的问题
    Window.open 实现导航与打开窗口,导航到一个特定链接地址,也可以打开一个新的浏览器窗体
    8.0 BOM对象
    7.4 私有变量
    006_函数填充_计算列
    004_005_数据区域读取_填充数字
    003_行_列_单元格
    002_读写文件
  • 原文地址:https://www.cnblogs.com/raiven2008/p/4209223.html
Copyright © 2020-2023  润新知