问题描述:一共m个人围成一个圈,并编号1~m,从第一个人开始叫号,从1开始叫起,每叫到n的人出局,然后继续往后叫,直到只剩下一个人。
思路:首先用一个长度为m+1的一维数组a[m+1]记录,索引代表每个人的编号,数组的初始元素均为0,表示该编号的人未出局,当该人出局时将其元素改为1 。然后确定游戏结束的条件,即当出局的人达到 m-1的时候游戏结束。因此我们用一个变量count来记录出局的人,同时我们应该用一个变量i来记录此时轮到哪个人,当i为m+1时应将其调整为1,例如十个人的圈,当轮到第十一个人时其实就是轮到第1个人,还要用一个变量flag来记录此时应该喊哪一个数,并且、只有当a[i] 等于0的时候flag才自增,还有一个注意的点是当flag 等于 n的时候我们要将此时的a[i] 赋值为1,表示该人出局,并且将flag重新赋值为1 。
代码实现如下:
#include "stdio.h"
int a[100];
int main(){
int m,n;
scanf("%d %d",&m,&n);
int count =0,i=1,flag =1;
//初始化数据,count表示出局人数,初始为0。i表示轮到哪个人,初始为第一个人。flag表示该喊的数,初始为1。
while(count!=m-1){
//只要出局人数没有达到m-1人游戏就一直继续。
if(i == m+1){
i =1;
}
//如果此时轮到第m+1个人,那么其实就是轮到第一个人
if(a[i] != 1){
//只对没有出局的人操作,出局的人直接跳过
if(flag == n+1){
flag =1;
}
//如果此时该喊的数为n+1,其实就是该喊1
if(flag == n){
a[i] =1;count++;
}
//当此时该喊n的时候,该人出局,出局数加1
flag++;
//只有a[i] != 1,即该人没有出局的时候喊的数才加1,即若此人出局则直接跳过。
}
i++;
//无论轮到的人出局与否,轮到的人都要加1,当只对没有出局的人操作。
}
for(int i=1;i<=m;i++){
if(a[i] == 0){
printf("%d",i);
}
}
//最后输出最后剩下的人的编号。
}