问题描述:n个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人连续从1开始报数,报到m的人出圈;如此往来来往,直到末了剩下的人胜出。算法书上基本是用链表来办理问题,当初学者对链表都还不是很清楚的时候,可以利用已学的数组知识来办理。代码如下:
#include <iostream>
using namespace std;

int main()
{
//输入n个人、报数m
int n, m;
cin>>n>>m;
//将n个人编号存入数组
int a[n];
for(int i = 0; i < n; i++)
a[i] = i+1;
//loser为出圈的人数,count为数到m的计数器
int loser = 0;
int count = 0;
//当出圈人数小于n-1的时候,一贯循环下去
while(loser < n - 1)
{
for(int i = 0; i < n; i++ )
{
//数到m的人后,该数组元素置0,该人出圈,下一轮重新数的时候跳过,数组元素不为0解释该人仍在圈内
if (a[i]!=0)
{
count++;
if(count == m)
{
loser++;
a[i] = 0;
count = 0;
}
//当出圈的人为n-1,游戏结束,跳出循环,剩下的人胜出
if(loser == n - 1)
break;
}
}
}
//打印出终极胜出的人的编号
for(int i = 0; i < n; i++)
{
if(a[i]!=0)
cout<<i+1;
}
return 0;
}