约瑟夫问题
Problem Description
n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
Input
输入n和m值。
Output
输出胜利者的编号。
Example Input
5 3
Example Output
4
#include <stdio.h> #include <stdlib.h> struct sdut { int num; struct sdut *next; }; int main() { int a, b, i; int number = 0, count = 0; scanf("%d%d", &a, &b); struct sdut *p, *head, *tail, *q; p = (struct sdut*) malloc (sizeof(struct sdut)); p -> num = 1; p -> next = NULL; head = p; tail = p; for(i = 2; i <= a; i++) { p = (struct sdut*) malloc (sizeof(struct sdut)); p -> num = i; tail -> next = p; tail = p; p -> next = NULL; } tail -> next = head; q = head; while(q -> next != head) q = q -> next; while(count < a - 1) { p = q -> next; number++; if(number % b == 0) { q -> next = p -> next; free(p); count++; } else { q = p; } } printf("%d\n", q -> num); return 0; }