约瑟夫问题

题目描述
n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.
输入格式:
n m
输出格式:
出圈的编号
说明
m,n≤100

数据较小,直接模拟了,应该可以直接用数学推(不确定),推出第几个出局的是第几个人。

#include<cstdio>
using namespace std;
int main() {
    int n,m,s=0;
    scanf("%d%d",&n,&m);
    bool visit[200]= {0}; 
    for(int k=0; k<n; k++) { 
        for(int i=0; i<m; i++) {
            if(++s>n)s=1;    //模拟环状结构
            if(visit[s])i--;    //跳过出局的人
        }
        printf("%d ",s);    //出局
        visit[s]=true;
    }
    return 0;
}
posted @ 2017-12-16 18:52  WenOI  阅读(148)  评论(0编辑  收藏  举报
水波背景