约瑟夫问题

本文通过使用循环链表实现约瑟夫问题的解决方案,详细介绍了如何通过编程来模拟这一经典的数学问题。具体包括了创建链表、游戏过程的模拟及最终胜利者的确定。

约瑟夫问题

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

n个人想玩残酷的死亡游戏,游戏规则如下:  

n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。

请输出最后一个人的编号。

输入

输入n和m值。

输出

输出胜利者的编号。

示例输入

5 3

示例输出

4

提示

第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
 
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #include<stdlib.h>  
  4.   
  5. struct node  
  6. {  
  7.     int data;  
  8.     node *next;  
  9. }*head, *p, *tail, *q;  
  10.   
  11. struct node *creat(int n)  
  12. {  
  13.     head=new node;  
  14.     head->next=NULL;  
  15.     q=new node;  
  16.     q->next=NULL;  
  17.     q->data=1;  
  18.     tail=q;  
  19.     head=q;  
  20.     for(int i=2; i<=n; i++)  
  21.     {  
  22.         q=new node;  
  23.         q->next=NULL;  
  24.         q->data=i;  
  25.         tail->next=q;  
  26.         tail=q;  
  27.     }  
  28.     tail->next=head; //建立了循环链表 
  29.     return head;  
  30. }  
  31.   
  32. int main()  
  33. {  
  34.     int n, m;  
  35.     scanf("%d%d", &n, &m);  
  36.     head=creat(n);  //创建链表
  37.     p=head;  
  38.     while(p->next!=head)  
  39.         p=p->next;  
  40.     int num=0, count=0;  
  41.     while(count<n-1) //当最后只剩下一个人的时候跳出循环
  42.     {  
  43.         q=p->next;  
  44.         num++;  
  45.         if(num%m==0)  
  46.         {  
  47.             p->next=q->next;  
  48.             free(q);  
  49.             count++;  
  50.         }  
  51.         else  
  52.         {  
  53.             p=q;  
  54.         }  
  55.     }  
  56.     printf("%d\n", p->data);  
  57.     return 0;  
  58. }  
  59.   
  60.   
  61.   
  62.   
  63.   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值