约瑟夫环四种解法(数组,链表,递归,数学归纳)C/C++

一.题目概述

约瑟夫环问题是一个很经典的问题:一个圈共有N个人(N为不确定的数字),第一个人的编号为1第二个人的编号为2号,第三个人的编号为3号,第N个人的编号为N号,现在提供一个数字M,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到M这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到M的人出局,直到N个人全部出局,请问,这个出局的顺序是什么?

二.解题流程

1.问题重述

通过阅读题干,我们可总结出本题的关键信息:

N个人围成一个圈,编号由一到N ,报到M 的人出局直到剩最后一个人,求出局的顺序。

2.分析问题

        首先,要求出局的顺序,说明要按出局顺序输出这N个人的编号,所以我们先要存储N个人的编号,存储已知个数的数据,首先想到的是数组,但数组开辟的固定空间无法释放,若N的值非常大,会造成空间占用过大,此时可以想到用链表存储这N个数据,可通过释放节点空间进行空间节约,同时在出局操作中链表也更便捷。

        解决了存储问题后,第二步我们要考虑的便是如何淘汰报数到M的人,这里的解决方法根据存储方式的不同而不同,我们下面对数组和链表分别进行分析。

3.解决问题

1.普通数组法

        最直接的思路便是把N个人的编号存储到大小为N的数组中。

        因为题目要求从1开始报数,所以我们可以从数组的下标1开始存储,不使用下标0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值