【算法】约瑟夫环问题及解法

本文介绍了约瑟夫环问题,从问题描述、关键知识点到两种解法的详细阐述。解法一使用预定义数组,但存在空间浪费和运行效率低的问题;解法二采用循环链表实现,解决了上述问题,提高了效率。
摘要由CSDN通过智能技术生成
约瑟夫环问题描述

  已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。要求输出最后一位出列的人的序号。

知识拆解

在这里插入图片描述
  该问题主要包括两点:圆环的形成以及动态迭代
圆环形成:

  • 链表
  • 数组

动态迭代:

  • 对于链表,可以直接删除特定节点
  • 对于数组,利用新数组重新存储每次更新后的数据;通过对数组数据移位来完成数据更新
解法
解法一:
  1. 预先定义足够大的数组,解决数据长度问题;
int num[1000] = {
   0};
  1. 记录数组当前数据长度,当下标超出时,返回数组首部;
int i,m = N;	//i--数组下标;N--数据录入的长度
if(i >= m)
	i = 0;		//返回数组首部
  1. 在规定编号处,数组数据前移,减小数据长度;
		if(j == 3)
		{
   
			m--;					//数据长度减1
			printf(" %d ",num[i]);
			for(n=i;n<m;n++)
			{
   
				num[n] = num[n+1];		//从该位置,数组数据前移
			}
			for(n=0;n<m;n++
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值