c语言约瑟夫环10人报三退出,约瑟夫环问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。...

博客介绍了如何使用C语言解决约瑟夫环问题,即有n个人围成一圈,从第一个人开始按1到3报数,报到3的人退出,直到最后剩下一个人。博主分享了代码实现,通过遍历列表,隔两个删除一个元素,直至剩下最后一个元素。文章中还提出了对于人数n和排除数m之间的关联性以及变化题目(如报数到5退出)的思考问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我最大的学习来源不是百度而是我群友~~在这里表白一波我热爱学习的群友们!

然后今天群里突然有人提出了题目的这个问题:

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

冥思苦想了半天(好吧,我承认我就审了审题目就百度了。。),然后查到了几种算法吧,但是我不知道是因为我只会java还是真的有的人的思路比较广泛,跳跃,所以看起来略复杂啊。

然后有仔细看了半天,稍微好一点勉强看懂了,但是我觉得还是不简单,而且是思维上的绕圈。

然后继续说我又在网上找了找,果然找到一种我觉得很简单易懂而且很方便的解决方法,然后我又在其基础上做了解释说明,下面是解法:

package test;

import java.util.ArrayList;

import java.util.List;

/**

* 约瑟夫环问题的解决

* @author sijia

*

*/

public class Demo1 {

public static void main(String[] args) {

List list = new ArrayList();

list.add(0);

list.add(1);

list.add(2);

list.add(3);

list.add(4);

list.add(5);

list.add(6);

list.add(7);

list.add(8);

list.add(9);

list.add(10);

list.add(11);

list.add(12);

list.add(13);

list.add(14);

list.add(15);

list.add(16);

//思路是遍历数组,隔两个删除一个元素,直到只剩下一个元素。如果到了数组末尾则跳转开头

int i=0;

while(list.size()!=1) {

//遍历到了最后一个元素,i+2是跳转到正数第二个元素

if(i>=list.size()-1) {

i=-1;

}

//遍历到了倒数第二个元素,i+2是跳转到第一个元素

if(i>=list.size()-2) {

i=-2;

}

//以上完成了数组据末尾跳转到数组开头

i=i+2;

/**

* 删除元素

* 这里不理解的可以做个带入。第一次删除0+2,也就是把下标为2的元素删除了。第二次继续,走到这里

* i=2+2变成了4.为什么这次删除下标为4的?因为之前把下标为2的删除后,后面的元素依次前移了。

* 原下标3的现在下标为2.同理,原下标为5的现在下标为4.

* 如此:3,4,后面原下标5现下标4的元素删除。符合了题目的逻辑。

* i每次都加2,是因为上一轮删除了一个元素,整个下标都前移了。所以才会+2代表隔了两个删除一个

* 同样大家可以考虑一下这道题的变换:比如题目变成隔5个删除一个,也就是报数1-6,数到6的出局要怎么写?

*

*/

list.remove(i);

}

/**

* 最后打印出来的就是剩下的那个元素,因为我这里取巧,将下标和元素的值对应了,所以我们不仅可以看出元素的值

* 还可以看元素原来的下标。如果不这么做可以在一开始就复制一份list,然后用最后剩下来的值去反推,再不济还能不移除而是用别的方法标记出局。这样要改动的比较大

* 这个 数值与数组list的总元素数,也就是题目中的N息息相关,我反正试了多次。

*/

System.out.print(list.get(0));

}

}

至此,问题解决,然后文中我留了两个问题:

1.这个人数n和排除的数m之间是有一定关联关系的,但是我这个数学渣有点没耐心一遍遍测试或者思考了,所以作为一个遗留问题吧。

2.我文中说的,这个方法是实现N个人数到3退出的代码。但是如果题目是N个人数到5退出呢?又该怎么写?反正我目前是有思路了,有意的可以私信我探讨哦~~

全文手打不易,如果稍微帮到你了,请点个喜欢点个关注支持一下~~~~~也祝大家工作顺顺利利!

37 有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位.

题目:有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位. public class _037NumberOff { public st ...

20190121-n个人围成一圈,凡报到3的人退出圈子,最后留下的是原来第几号的那位

1. 报数问题:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位 思路:此题主要问题在于但凡报到3的人退出圈子,而报数的号码与圈子的 ...

代码实现:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

import java.util.ArrayList; import java.util.List; import java.util.Scanner; //有n个人围成一圈,顺序排号.从第一个人开始 ...

java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。

1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 ...

报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

n = int(input("请输入人数:")) list_p = list(range(1,n+1)) #将所有人放在一个数字里面 count = 0 #设置一个变量,用户计算报 ...

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

先写我的思路,没有用指针的做法.如果你用的是VC,把第六行去掉. #include #include int main() { setvb ...

有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

#include using namespace std; int main() { int i,j,n,m,k,*p,num[100];k=m=0;   cin&g ...

用Matlab完成:从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

程序思路: (1)一圈人循环报数,报数报到3的人,将其置为0,表示被淘汰: (2)那么在接下去的循环中,被淘汰的人不参与报数: (3)直到仅有1人没被淘汰,并显示出他之前的编号. 程序实现如下: cl ...

随机推荐

Oracle_数据处理

数据操纵语言 DML(Data Manipulation Language – 数据操纵语言) 可以在下列条件下执行: - 向表中插入数据 - 修改现存数据 - 删除现存数据* 事务是由完成若干项工作 ...

直接操作 SDL_Overlay YUV叠加上的像素

根据这篇解码出yuv数据后 海思h264解码库 y,u,v数据全部存进数组内,          IntPtr y = _decodeFrame.pY;                 IntPtr ...

Spring boot mybatis项目启动后一直刷日志的bug修复……

最近接手一个项目,使用的框架是springboot+mybatis: 其中持久层是使用mybatis集成的,sql是配置在mapper.xml文件中: 然后呢,有时候做新功能的时候,往xml文件中增加 ...

Nutch源码阅读进程5---updatedb

看nutch的源码仿佛就是一场谍战片,而构成这精彩绝伦的谍战剧情的就是nutch的每一个从inject->generate->fetch->parse->update的环节,首 ...

HDU 4762 Cut the Cake(公式)

Cut the Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

2 个UserControl 的传值问题

问题描述:有2个UserControl:UserControl1 里有一个Button,UserControl2 里面有一个TextBox,这2个控件都加载到了主窗体Form1 上.要求的是,点击 U ...

【bzoj2463】 谁能赢呢?

www.lydsy.com/JudgeOnline/problem.php?id=2463 (题目链接) 题意 一个n*n的棋盘,开始时左上角有一个棋子,每次可以把棋子向4个方向移动,但不能移动到曾经 ...

【DFS】NYOJ-325-zb的生日

[题目链接:NYOJ-325] 一道以我名字命名的题目,难道要我生日的时候再A? 思路:依旧深搜,但这个问题应该有一个专有名词吧,看别的博客说是 “容量为 sum/2 的背包问题”,不懂... // ...

bjfu1109 最小公倍数和

这题真是过了n年才a.最早是在2010年北大培训比赛上看到的这题,当时我不会,竹教主也不会,但他记下来了,研究一段时间后就会了,还把这题加到我校oj上.过了这么多年,我上网搜,关于这个问题的解题报告还 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值