zoukankan      html  css  js  c++  java
  • 很有趣的一道编程题,子弹分发问题

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



  • 相关阅读:
    「小程序JAVA实战」小程序视频封面处理(48)
    「小程序JAVA实战」小程序视频处理工具ffmpeg(47)
    「小程序JAVA实战」小程序上传短视频(46)
    微信小程序跳转navigateTo与redirectTo
    微信小程序中this关键字使用技巧
    ***电商数据库设计参考:ecshop数据库+订单表结构等
    MYSQL中'TYPE=MyISAM'错误的解决方案
    PHP实现执行定时任务的几种思路详解
    PHP定时器实现每隔几秒运行一次
    ***LINUX添加PHP环境变量:CentOS下将php和mysql命令加入到环境变量中
  • 原文地址:https://www.cnblogs.com/raiven2008/p/4209223.html
Copyright © 2011-2022 走看看