解题思路:

     题目重述: 约瑟夫环问题是一个自杀问题。

                 ①在n个人情况下,从1~m报数,凡报到m即退出自杀。

                 ②再次从1(第m+1个) 开始报数,再次报到m(m+m),退出自杀。

                 ③ 依次循环...........

    图解思路

          设有7个人,即a[7],1~3报数。

                 报到3,就出局!!! 

 蓝色为剩余结果,标红3为出局人。

             

         a[7]    0  1  2  3  4  5  6

     第一轮    1  2  3  1  2  1

     结果:    0  1      3  4      6  

     第二轮    3      1  2      3

     结果:    0          3  4

     第三轮    1          2  3

     结果:    0          3     

     第四轮    1          2

     结果:       0          3

     第五轮    3          1

     结果:                3


     注意:结果是3,但位置是4,数组从0开始

  

   思路

    ①设置数组a[n],a[i]为0表示未出局,为1表示出局;

    ②设置dh,用于记录已出局人数,用于退出出局循环;

    ③设置mouth,用于记录报数1~n,每当出局一个人,mouth重新置为1,重新报数;

    ④当a[i]!=1时,即最后一个未出局人。


参考代码:

#includeint main()
{
     int n;
     scanf("%d",&n);
     int a[n];
     for(int i=0;i<n;i++)
     a[i]=0;              //输入n,并将a[]置为0
     
     int dh=0;
     int mouth=1;        //设置退出循环条件,报数初值
     int i=0;
     while(1){         //无限循环,除非遇break
     
         if(dh==n-1)break;     //n-1即只剩最后一人,退出循环
         if(a[i]==1)i++;      //已经出局的人,不做计算,即不报数
         else {
             if(mouth==3){    //满足出局条件
                 a[i]=1;        //标记为出局
                 dh++;         //出局人数累加
               // printf(" %d\n", i);    //输出每个出局顺序
                 mouth=1;      //报数重新置为1
                 
                 i++;        //加1,遍历,循环
             }
             else{
                 mouth++;
                 i++;
                 
             }
         }
         if(i==n)i=0;
         
     }
     int z=0;                   //输出最后 幸存 位置
     for(int i=0;i<n;i++){
        if(a[i]!=1){            
            
           z=i;
         //  printf("%d\n", i);
        }
     
     }
     printf("%d",z+1);
     return 0;
}



本文是对CSDN博主文章理解所写

文章链接:

版权声明:本文为CSDN博主「StazSans」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_61960789/article/details/121764029


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论