题型描述
n 个人围成一圈,从第一个人开始报数,报到 m 的人出圈,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依此类推,直到所有人都出圈。
该问题需要 输出依次出圈人的编号 或 直接输出最后一个出圈人的编号。
解题思路
1.数组模拟
将 n 个人的编号存入数组,从第一个人开始报数,输出报数 m 的人的编号,并将该编号清零(表示出圈)。在之后的每次报数之前要判断是否在圈内,重复这样的操作直至出圈的人数等于 n 。
#include<stdio.h>
int main()
{
int n,m,i,num=0,count=0;
int a[120];
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
a[i]=i;
}/*存入编号*/
for(i=1;;i++){
if(a[i]!=0){
num++;/* num 表示计数器*/
if(num==m){
count++;
if(count==n){
break;
}
printf("%d ",a[i]);
a[i]=0;
num=0;
}/* 报数为 m 出圈:
出圈人数加一,输出编号,编号清零,计数器清零*/
}
if(i==n){
i=0;
}
}
printf("%d",a[i]);
return 0;
}
2.链表模拟
3.数学推导公式
(直接得到最后一个出圈人的编号)->待学习
参考资料:用一行代码解决约瑟夫环问题