题干解读:在1个由n个人组成的环中,从第k个人开始报数,当报数到m时,报数的那个人出队,然后下一个人重新开始报数,要求输出最后剩下的那个人.

解题思路:使用数组a[n]表示n个人的队伍中每个人的情况,当其值为1表示在队伍中,为0表示出队。

p表示当前处理的人的位置,num表示出队人数.

使用flag模拟现实中报数的情况,从第k个人开始,当该人在队伍中时(a[i]==1),flag+1(即报一个数),当这个数到m时,这个人出队(a[i]=0)同时num会加1,如果当遍历到这个数组的最后1个数时,会重新从第一个开始遍历(是一个环)。

当出队人数为n-1时,找到最后一个没出队的人,并输出他的位置即可。

#include <iostream>
using namespace std;

int main() {
    int n,k,m;
    cin>>n>>k>>m;
    int a[n];
    int flag=0;//flag用于模拟报数
    int num=0;//num表示出队人的数量
    for(int i=0;i<n;i++){
        a[i] =1;
    }
    int p=k;
    while(num != n-1){
        if(a[p] == 1){
            flag++;
            if(flag  == m){
                a[p] = 0;
                flag=0;
                num++;
            }
        }
        if(p==n-1){
            p=0;
        }else{
            p++;
        }
    }
    for(int i=0;i<n;i++){
        if(a[i]==1){
            cout<<i;
        }
    }
    

}