Tybsornner


私信TA

用户名:gaoweiCC

访问量:1547

签 名:

等  级
排  名 7413
经  验 1265
参赛次数 1
文章发表 2
年  龄 0
在职情况 学生
学  校 洛阳师范学院
专  业

  自我简介:

题目要求:

        有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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区