洛谷P1996 约瑟夫问题
题目描述
n个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。
输入输出样例
输入
10 3
输出
3 6 9 2 7 1 8 5 10 4
建立一个用于判断此人是否出圈的数组
bool a[200]={0};
根据题目描述,直至所有人出圈,所以外部循环次数应该为人数n,循环一次代表一个人出圈。
for(k=0;k<n;k++)
内部循环为m次,循环一次代表从第一个人报数至m。
此处需要注意,如果此时已是最后一人报数,则下一个应该从第一人重新开始,只需判断++s与n的大小。
前面建立的数组代表这个人的状态,如果为true则代表此人已经出圈,在循环时应该跳过,也就是不执行此次循环,i减去1即可。
内部循环一整次之后,输出此次报数出圈的人,并令其为true
完整代码如下
#include<stdio.h>
int main()
{
int m,n,k;
int s=0;
bool a[200]={0};
scanf("%d %d",&n,&m);
for(k=0;k<n;k++)
{
for(int i=0;i<m;i++)
{
if(++s>n) s=1;
if(a[s]) i--;
}
printf("%d ",s);
a[s]=true;
}
return 0;
}