约瑟夫问题来源于公元1世纪的犹太历史学家Josephus。问题描述,有n个人(分别用姓名表示)围成一个圆圈,从编号为1的人开始进行1~m正向报数,报到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;如此重复下去,直到所有的人全部出列,求出列的顺序。
输入格式:
第1行,二个用空格隔开的整数N,M(2≤N≤100,M≤10),表示N个人,游戏规则为数到第M人出列
接下来输入N行,每行为一个游戏人的姓名(英文,长度不超出20,姓名中可以包含空格)
输出格式:
输出N行,依次为出列者的姓名。
输入样例:
在这里给出一组输入。例如:
4 3
One
Two
Three
Four
输出样例:
在这里给出相应的输出。例如:
Three
Two
Four
One
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//#include<iostream>
//using namespace std;
#define MAX 101
#define MIN 25
char a[MAX][MIN];
int b[MAX] = { 0 };
int num[MAX] = { 0 };
int main()
{
int N, M;
int cnt = 0, i = 0, k = 0;
scanf("%d%d", &N, &M);
getchar();
for (int i = 0; i < N; i++)
{
gets(a[i]);
}
while (cnt != N)
{
i++;
if (i > N) i = 1;
if (b[i] == 0)
{
k++;
if (k == M)
{
b[i] = 1;
num[cnt] = i;
cnt++;
k = 0;
}
}
}
//printf("%d\n", cnt);
for (int i = 0; i < cnt; i++)
{
int k = num[i]-1;
puts( a[k]);
}
return 0;
}