P1996 约瑟夫问题

(什么?!要给学弟学妹讲约瑟夫问题?!难道就不怕我给他们讲错了吗?! 啊啊啊,为了不给学弟学妹们讲错,蒟蒻表示要临阵磨一下刀、、、)

题目背景

约瑟夫是一个无聊的人!!!

题目描述

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

输入输出格式

输入格式:

n m

输出格式:

出圈的编号

输入输出样例

输入样例#1:

10 3
输出样例#1:

3 6 9 2 7 1 8 5 10 4

说明

m, n \le 100m,n≤100

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 30005
using namespace std;
int n,m;
bool vis[N];
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
int work()
{
    ,j=;
    while(sum<n)
    {
        ;i<=n&&sum<n;i++)
        {
            if(vis[i]) continue;
            j++;
            if(j==m)
            {
                vis[i]=true;
                printf("%d ",i);
                sum++;j=;
            }
        }
    }
}
int main()
{

    n=read(),m=read();
    work();
    ;
}

法一

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 30005
using namespace std;
int n,m,a[N];
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
int work()
{
    ;i<n;i++) a[i]=i+;
    a[n]=;,now=n,sum=;
    while(sum<n)
    {
        while(k<m)
        {
            k++;
            now=a[now];
        }
        printf("%d ",a[now]);
        sum++;//sum表示的是出队的人的个数
        a[now]=a[a[now]];k=;
    }
}
int main()
{
    n=read(),m=read();
    work();
    ;
}

法二

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 30005
using namespace std;
int n,m,a[N];
bool vis[N];
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
int work()
{
    ;
    ;i<=n;i++) a[i]=i;
    while(n)
    {
        now=(now+m-)%n;
        ) now=n;
        printf("%d ",a[now]);
        ];
        n--;
    }
}
int main()
{

    n=read(),m=read();
    work();
    ;
}

法三

05-11 11:19