约瑟夫问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
输入
输入n和m值。
输出
输出胜利者的编号。
示例输入
5 3
示例输出
4
提示
第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- struct node
- {
- int data;
- node *next;
- }*head, *p, *tail, *q;
- struct node *creat(int n)
- {
- head=new node;
- head->next=NULL;
- q=new node;
- q->next=NULL;
- q->data=1;
- tail=q;
- head=q;
- for(int i=2; i<=n; i++)
- {
- q=new node;
- q->next=NULL;
- q->data=i;
- tail->next=q;
- tail=q;
- }
- tail->next=head; //建立了循环链表
- return head;
- }
- int main()
- {
- int n, m;
- scanf("%d%d", &n, &m);
- head=creat(n); //创建链表
- p=head;
- while(p->next!=head)
- p=p->next;
- int num=0, count=0;
- while(count<n-1) //当最后只剩下一个人的时候跳出循环
- {
- q=p->next;
- num++;
- if(num%m==0)
- {
- p->next=q->next;
- free(q);
- count++;
- }
- else
- {
- p=q;
- }
- }
- printf("%d\n", p->data);
- return 0;
- }
本文通过使用循环链表实现约瑟夫问题的解决方案,详细介绍了如何通过编程来模拟这一经典的数学问题。具体包括了创建链表、游戏过程的模拟及最终胜利者的确定。
697

被折叠的 条评论
为什么被折叠?



