约瑟夫问题(寻找猴王)

本文介绍了一个经典的约瑟夫问题的解决方法,通过建立双向循环链表模拟猴子报数过程,每次报数到m的猴子退出,直至只剩最后一只猴王。输入n和m后,程序输出猴王的编号。文中详细阐述了思路,并提供了函数与类的实现代码。
摘要由CSDN通过智能技术生成

题目内容:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

输入格式:输入包含两个整数,第一个是n,第二个是m (0 < m,n <=300)。

输出格式:输出包含一行,即最后猴王的编号。

输入样例:18 2

输出样例:5


思路

  1. 使用一个循环链表将这些猴子串起来,每次报号后就向后 ☞ work = work->next ; 当报号到所输入的num时候便删除当前节点。
  2. 使用双向循环链表,使删除操作更简单。
  3. 注意我使用work指向的下一个节点,即:若我设置编号为 1–2--3–4--5–6 的序列设置口号 2 则 报完第一个轮次后,work节点为 3,设立一个temp节点为 2,然后delete temp ; 从而使work节点始终处于工作状态直至 work->next = work(只有一个节点)即为King。

函数与类

/* Author : YaaaZa! ?  
*  Time	  : 2018.10.20
*  Joseph_Qus
*/
struct Node {   				//节点结构体
	int data;
	Node* next;
	Node* prev;
};

class list   					//链表类
{
	Node* head;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值