题目要求:

        有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

解题思路:

       采用数组来存放所有的人数,并为所有元素(所有人)打上标记为T(true),记录全部人数赋值给sum,采用循环进行不断报数,每当一个人报数为3时,说明此人被淘汰,打上标记为F(false),当轮着一圈报完数后,重新从第一个人开始报数,进行淘汰,直至剩下最后一人时,跳出循环,通过标记T(true)来输出此人的序号(注意不是数组下标).

注意事项:

       1.当一个人的标记为T(true)时,才可以进行报数,即 i 的不断累加。

       2.当人数累加到数组上限时,即轮着报数已一圈,则数组变为0元素继续报数。

       3.必须是先判断一个人的标记再进行操作,另判断标记应放在循环最前端,否则可能k累加范围超过数组上限仍进行判断导致程序出错。

源代码如下,仅供参考(鼓励多种思路解题):

#include<stdio.h>
int main()
{
     int a,i=0,k=0,sum;
     scanf("%d",&a);//输入数组总的长度,也就是a的个数;
     sum=a;//将总人数a赋值给sum;
     char score[a];//定义字符型数组score[a];
     for(int j=0;j<a;j++) score[j]='T';//为这些元素全部附初值为T
     while(sum>1)//进入while循环,当一个人对应i=3时,人数减去1.
     {
          if(score[k]=='T') i++;//若这个人没被淘汰时,i的值累加
          if(i>=3&&score[k]=='T')//若累加到3,这个人为T时,进行操作
            {
            i=0;//i的值重新记为0
            score[k]='F';//这个人被记为F,淘汰
            sum--;//人的总数减一;
            }
           k++;//重新开始报数
           if(k>a-1)//若k累加到数组人数之上时,代表一圈报数的结束
           {
               k=0;//数组重新从零开始
           }
   }
 for(int i=0;i<a;i++)
 {
     if(score[i]=='T')//判断最后结果仍为T的人是最后一个人
      {
       printf("%d",i+1);//输出这个人的序号(注意:不是数组下标)
      }
  }
 return 0;
}

可能源代码从dev-c++粘上去比较乱,了解思路即可。加油!

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论