题干解读:在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;
}
}
}

京公网安备 11010502036488号