约瑟夫问题
Time Limit: 1000MS Memory Limit: 65536KB
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
Hint
第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
实验代码
#include <string.h> #include <stdlib.h> #include <stdio.h> typedef struct mod { int data; struct mod *next; }play; int main() { play *p, *q, *head; head=(play *)malloc(sizeof(play)); head->data=1; q=head; int n,m, i, k; scanf("%d%d",&n,&m); for(i=2;i<=n;i++) { p=(play *)malloc(sizeof(play)); p->data=i; q->next=p; p->next=head; q=p; } p=p->next; k=1; while(n!=1) { if(k%m==0) { p=p->next; q->next=q->next->next; k=0; n--; } else { q=q->next; p=p->next; } k++; } printf("%d ",p->data); return 0; }