解题思路:把所有人弄成一个状态数组,出圈的状态设置为0,仍在圈中的状态唯一,先想办法搞到数组的长度,写了一个函数计算初始数组的长度,只能来计算状态数组的初始长度,再写一个求和函数,如果数组中最后的和等于1的话,那么这个1就是剩下的最后那个人,输出他的编号即可。

  1. 注意事项:计数为m的整数倍后把此数置为,表示出圈,同时计数变量也要置为,从而重新计数。遇到数字0也要跳过,并且不计数,循环到数组尾部后,要从1开始继续遍历数组,直到数组的和等于1为止。循环用的变量即为该人编号。(从i=1开始循环)

  2. 参考代码:

    

#include<iostream>

using namespace std;

int ArrLength(int *Arr) //计算状态数组初始长度

{

int i = 0;

while (Arr[i]!=0)

i++;

return i;

}

int sum(int a[],int n)//计算状态数组的和来反映是否淘汰完毕

{

    int sums=0;

    for(int i=1;i<=n;i++)

    {

        sums+=a[i];

    }

    return sums;

}

int main()

{

    int n,m;

    while(cin>>n>>m)

    {

    if(n==m&&m==0) break;

    int arr[n];

    int count=0;

    arr[0]=0;

    for(int i=1;i<=n;i++)

    {

        arr[i]=1;

    }

    while(sum(arr,n)>1)

    {

        

        for(int i=1;i<=n;i++)

        {

            if(arr[i]==0)//位置i上的人已经出圈 

            {

                continue;//跳过此位置的人             

            }

            count++;//此人还没有出圈,报数加一 

            if(count%m==0)//如果此人报到m了,将此位置的数字化为0并从下一个重新报数 

            {

                arr[i]=0;

                count=0;                

            }

            if(i==n)//此数字为最后一个数字就从零开始。 

    {

    i=0;

}

        }

        

}

    for(int i=1;i<=n;i++)

    {

        if(arr[i]==1)

        cout<<i<<endl;

    }

}

    


    return 0;

}


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论