约瑟夫问题来源于公元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;
}