关于约瑟夫问题

第一次去一家深圳公司面试,结果狼狈的被请了出来,其中考了一个算法,约瑟夫问题,我搞了半天没搞出来,下来查了一下资料仔细研究了一下


<?php
/*
一群猴子排成一圈,按1,2,...,n依次编号。
然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,
在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。
要求编程模拟此过程,输入m、n,
输出最后那个大王的编号。
*/
function king($n,$m)
{
	$i=0;
	$arr = range(1,$n);//创建:含有100个值的数组
	while(count($arr)>=$m)
	{
		++$i;
		//不断出队(即删除数组的第一个元素)
		$survice = array_shift($arr);
		if($i%$m!=0)
		{
			//结合约瑟夫环问题
			//报到3就自杀(从队列中踢出),否则等待下一次的审判(再次添加到队尾)
		  array_push($arr, $survice);
		} 
		
	}
	return $arr;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 约瑟夫问题的代码可以使用循环来解决,具体代码如下:n = int(input("请输入总人数: ")) k = int(input("请输入循环数: "))array = [i for i in range(1, n+1)]while len(array) > 1: index = (k-1) % len(array) array.pop(index)print("最终的胜利者是:", array[0]) ### 回答2: 约瑟夫问题是一个经典的数学问题,描述了一个圆桌周围坐着n个人,每个人有一个独特的编号。从某个人开始,每次数m个人,数到第m个人时将其杀掉,然后重新开始数,直到最后只剩下一个人。问题是确定最后剩下的人是谁。 解决这个问题可以使用循环链表的数据结构。首先,创建一个长度为n的循环链表,每个节点存储一个人的编号。然后,从某个起始节点开始,遍历链表并数m个节点,将第m个节点从链表中移除。重复这一步骤,直到链表中只剩下一个节点为止,该节点所对应的人即为最后剩下的人。 下面是一个简单的Python代码实现约瑟夫问题: ```python def josephus(n, m): circle = list(range(1, n+1)) # 创建初始的编号列表 index = 0 # 起始位置为列表的第一个元素 while len(circle) > 1: # 当列表中还剩下多余一个元素时循环执行 index = (index + m - 1) % len(circle) # 计算需要移除的节点的索引 circle.pop(index) # 移除节点 return circle[0] # 返回最后剩下的人的编号 # 示例使用 n = 7 # 总共有7个人 m = 3 # 每次数3个人 last_person = josephus(n, m) print(f"最后剩下的人的编号是: {last_person}") ``` 以上代码将输出:最后剩下的人的编号是: 4 这段代码使用了一个循环链表来解决约瑟夫问题,通过不断移除指定位置的节点来模拟约瑟夫问题的过程,最终找到最后剩下的人。 ### 回答3: 约瑟夫问题是一个经典的数学问题,该问题描述为:有n个人坐成一个圈,从某个人开始报数,每数到m的人出列,然后从下一个人重新开始报数,重复此过程,直到只剩下最后一个人。现在我们来用代码实现约瑟夫问题。 我们可以使用循环链表的数据结构来表示这个人组成的圈,每个节点可以存储一个人的信息。首先,我们需要定义一个节点类,包括人的编号和指向下一个节点的指针。然后,我们创建一个循环链表,并将所有人的信息存储在其中。 接下来,我们设定游戏的初始状态,即第一个进行报数的人和每次报到的数。然后,我们通过遍历循环链表,并进行相应的操作,直到只剩下最后一个人。 具体的代码如下: ```python class Node: def __init__(self, number): self.number = number self.next = None def josephus(n, m): # 创建循环链表 head = Node(1) curr = head for i in range(2, n+1): curr.next = Node(i) curr = curr.next curr.next = head # 链接到头节点形成循环链表 # 开始游戏 curr = head while curr.next != curr: # 报数m次 for _ in range(m-1): curr = curr.next # 当前节点出列 curr.next = curr.next.next curr = curr.next return curr.number n = 10 # 人数 m = 3 # 报数的数 winner = josephus(n, m) print("最后剩下的人的编号是:", winner) ``` 以上就是关于约瑟夫问题的代码实现。通过创建循环链表,并进行循环遍历,实现了约瑟夫问题的求解。最后,我们输出最后剩下的人的编号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值