2018: 约瑟夫问题
时间限制: 1 Sec 内存限制: 64 MB提交: 1126 解决: 765
[提交][状态][讨论版][命题人:外部导入]
题目描述
n个人想玩残酷的死亡游戏,游戏规则如下: n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。 请输出最后一个人的编号。
输入
输入n和m值。
输出
输出胜利者的编号。
样例输入
5 3
样例输出
4
提示
第一轮:3被杀
第二轮:1被杀
第三轮:5被杀
第四轮:2被杀
#include<stdio.h> #define N 50 int main() { int i, j, k, n, m, a[N]; //k为计数器, j为数数器, i为数组下标 scanf("%d%d", &n, &m); for(i = 0; i < n; ++i) a[i] = i + 1; for(k = 0, j = 1, i = 0; i < n; i = (i + 1) % n) //取余是为了模拟环 { if(a[i] != 0) //还活着 { if(j == m) //数到m { a[i] = 0; j = 0; //从新开始数数 k++; //死亡人数+1 if(k == n) //输出最后一个人 printf("%d ", i + 1); } j++; //计数 if(k == n) break; //没有活人,跳出循环 } } return 0; }