在某次实弹射击训练中,班长将十个战士围成一圈发子弹。 首先,班长给第一个战士10颗,第二个战士2颗,第三个战 士8颗,第四个战士22颗,第五个战士16颗,第六个战士4颗,*第七个战士10颗,第八个战士6颗,第九个战士14颗,第十个战士20颗。然后按如下方法

来源:互联网 发布:网络禁书大合集下载 编辑:程序博客网 时间:2024/04/29 18:03

在某次实弹射击训练中,班长将十个战士围成一圈发子弹。 首先,班长给第一个战士10颗,第二个战士2颗,第三个战 士8颗,第四个战士22颗,第五个战士16颗,第六个战士4颗,*第七个战士10颗,第八个战士6颗,第九个战士14颗,第十个战士20颗。*然后按如下方法将每个战士手中的子弹进行调整:所有的战士检查自己*手中的子弹数,如果子弹数为奇数,则向班长再要一颗。然后每个战士再同时将自己手中的子弹分一半给下一个战士(第10 个战士将手中的子弹分一半给第1个战士)。问需要多少次调整后,每个战士手中的子弹数都相等?每人各有多少颗子弹?
/**

*要求输出每轮调整后各战士手中的子弹数。
*要求结果的输出格式为
*
 *0   10   2   8  22  16   4  10   6  14  20  各战士手中原始的子弹数
 *1   xx  xx  xx  xx  xx  xx  xx  xx  xx  xx  第1轮各战士手中的子弹数
 *2   xx  xx  xx  xx  xx  xx  xx  xx  xx  xx  第2轮各战士手中的子弹数
  ……
 *n   xx  xx  xx  xx  xx  xx  xx  xx  xx  xx  最后一轮各战士手中的子弹数(应相等)
 */

#include"stdio.h"
  
 
    /**
 *对子弹数量是奇数的处理
 */
    void isSingle(int * counts)
 {
  int i ;
  for(i = 0; i < 10;i++)
  {
   if(counts[i]%2!=0)
   {
    counts[i]++;
   }
  }
 }
 /**
 * 判断所有战士的子弹数量是否相等;
 */
 int isEqual(int *counts)
 {
  int i = 1;
  int temp = counts[0];
  for(i;i<10;i++)
  {
   if(temp!=counts[i])
   {
    return 0;
   }
  }
  return 1;
 }
 /**
 *打印
 */
 void display(int *counts,int times)
 {
  int i ;
  printf("第%d次  ",times);
  for(  i = 0; i < 10; i++)
  {
   printf("%d  ",counts[i]);
  }
  printf("/n");
 }
  
 void main()
 {
  int counts[10]={10,2,8,22,16,4,10,6,14,20 };
  int i;
  int times = 1;
  int nextNum;
  int temp;
  display(counts,times);
  while(!isEqual(counts))
  {
   isSingle(counts);
   temp = counts[0]/2;
   for(i=0;i<10;i++)
   {
    if(i !=9)
    {
     counts[i] -= temp;
     nextNum = counts[i+1];
     counts[i+1] += temp;
     temp = nextNum/2;
    }else
    {
     counts[9] -=temp;
     counts[0]+=temp;
    }
   }
   times++;
   display(counts,times);
  }
 }

 

原创粉丝点击