约瑟夫环-(数组、循环链表、数学)

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

 

约瑟夫环运作如下:

1、一群人围在一起坐成环状(如:N)

2、从某个编号开始报数(如:S)

3、数到某个数(如:M)的时候,此人出列,下一个人重新报数

4、一直循环,直到所有人出列  ,约瑟夫环结束

模拟过程,求出最后的人。

把数组看成一个环,从第s个元素开始按m-1间隔删除元素,重复过程,直到元素全部去掉。

 

void Josephus(int a[],int n,int m,int s)
{int i,j;int k=n;for(i=0;i<n;i++)a[i]=i+1;//编号i=(s+n-1)%n;while(k){for(j=1;j<m;j++)i=(i+1)%k;//依次报数,头尾相连printf("%d\n",a[i]);//出局for(j=i+1;j<k;j++)a[j-1]=a[j];//删除本节点k--;}//模拟结束,最后输出的就是留下的人
}

 

可以用带头单循环链表来求解:

也是一样的,只是实现不同,给出核心代码:

    while(k){for(j=1;j<m;j++){pr=p;p=p->link;if(p==head)//头结点跳过{pr=p;p=p->link;}}k--;//打印pr->link=p->link;//删结点free(p);p=pr->link;//从下一个继续}

双向循环链表也可以解,和单链表类似,只是不需要保持前趋指针。

 

数学可解:

效率最高


int check_last_del(int n,int m)
{int i = 1;int ret = 0;for (i = 2; i<=n;i++)ret = (ret + m) %i;return ret+1;//因为ret是从0到n-1,最后别忘了加1。
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu麒麟下搭建FTP服务

一.怎么搭建FTP服务&#xff1a; 第一步>>更新库 linuxidclinuxidc:~$ sudo apt-get update 第二步>>采用如下命令安装VSFTPD的包 linuxidclinuxidc:~$ sudo apt-get install vsftpd 第三步>>安装完成后打开 /etc/vsftpd.conf 文件&#xff0c;按如下所述…

《数据结构上机实验(C语言实现)》笔记(1 / 12):绪论

文章目录验证性实验求1~n的连续整数和说明放码结果常见算法时间函数的增长趋势分析说明放码结果设计性实验求素数个数说明放码结果求连续整数阶乘的和说明放码结果验证性实验 求1~n的连续整数和 说明 对于给定的正整数n&#xff0c;求12…n12…n12…n&#xff0c;采用逐个累…

线性表实现一元多项式操作

数组存放&#xff1a; 不需要记录幂&#xff0c;下标就是。 比如1&#xff0c;2&#xff0c;3&#xff0c;5表示12x3x^25x^3 有了思路&#xff0c;我们很容易定义结构 typedef struct node{float * coef;//系数数组int maxSize;//最大容量int order;//最高阶数 }Polynomial…

ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件

在Linux下面如何去压缩文件或者目录呢&#xff1f; 在这里我们将学习zip, tar, tar.gz和tar.bz2等压缩格式的基本用法。 首先了解下Linux里面常用的压缩格式。 在我们探究这些用法之前&#xff0c;我想先跟大家分享一下使用不同压缩格式的经验。当然&#xff0c;我这里讲到的只…

《数据结构上机实验(C语言实现)》笔记(2 / 12):线性表

文章目录验证性实验实现顺序表各种基本运算的算法放码sqlist.hsqlist.cppexp2-1.cpp结果实现单链表各种基本运算的算法放码linklist.hlinklist.cppexp2-2.cpp结果实现双链表各种基本运算的算法放码dlinklist.hdlinklist.cppexp2-3.cpp结果实现循环单链表各种基本运算的算法放码…

链表排序-归并

链表排序&#xff0c;可以插入排序&#xff0c;我就不写了。 实现归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&…

ubuntu麒麟下安装并启用搜狗输入法

1.首先打开UK软件&#xff0c;输入搜狗寻找搜狗拼音软件 然后下载搜狗拼音软件 接着点击启动该软件 2.点击搜狗拼音的图标&#xff0c;进入搜狗拼音的设置窗口 点击高级&#xff0c;并打开FCITX设置 加入英语输入法 3.这样就可以进行中英文切换了

线性表表示集合

集合我们高中都学过吧&#xff1f; 最重要的几个特点&#xff1a;元素不能重复、各个元素之间没有关系、没有顺序 集合内的元素可以是单元素或者是集合。 对集合的操作&#xff1a;交集并集差集等&#xff0c;还有对自身的加减等。 需要频繁的加减元素&#xff0c;所以顺序…

家用无线路由器购买入门指南

视频一&#xff1a;「白问」普通大众 买路由器关注这几个点就够了 来源 例如商品名&#xff1a;AC 1200M 双频 AX前缀wifi6IEEE 802.11 AX AC前缀wifi5IEEE 802.11 AC AX比AC好 1200M 理论峰值 和网速无关 商家噱头 MIMO SU-MIMO 单用户多进多出&#xff08;早期&#xff…

ubuntu linux下执行.sh文件

ubuntu linux下执行.sh文件 首先&#xff0c;要确保这个文件的类型是可执行的。 有两种办法把文件设置为可执行文件。 1) 直接在文件属性标签中选中 "可执行"&#xff0c;--b 如果用的是图形界面&#xff0c;这个方法最简单直接。 2) 使用命令 chmod x file.sh。将可…

链表相交问题

本来想自己写&#xff0c;写了一半发现一篇文章&#xff0c;解释写得简单易懂&#xff0c;我就直接拿过来了。 这个问题值得反复地写&#xff0c;锻炼链表coding能力的好题。 //如果两个链表都不带环 int NotCycleCheckCross(pLinkNode head1,pLinkNode head2) {pLinkNode lis…

用JS写了一个模拟串行加法器

在重温《编码&#xff1a;隐匿在计算机软硬件背后的语言》第12章——二进制加法器时&#xff0c;心血来潮用JS写了一个模拟串行加法器。 测试断言工具TestUtils.js function assertTrue(actual){if(!actual)throw "Error actual: " actual " is not true.&q…

Android学习路线总结

title: Android学习路线总结&#xff0c;绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一、前言 不知不觉自己已经做了几年开发了&#xff0c;由记得刚出来工作的时候感觉自己能牛X&#xff0c;现在回想起来感觉好无知。懂的越…

双栈

利用栈底位置相对不变的特性&#xff0c;可以让两个顺序栈共享一个空间。 具体实现方法大概有两种&#xff1a; 一种是奇偶栈&#xff0c;就是所有下标为奇数的是一个栈&#xff0c;偶数是另一个栈。但是这样一个栈的最大存储就确定了&#xff0c;并没有起到互补空缺的作用&a…

Error when loading the SDK:解决方案

错误情况&#xff1a; 当打开eclipse时出现如下窗口&#xff08;内容如下&#xff09; Error when loading the SDK: Error: Error parsing \Android\adt-bundle-windows-x86_64-20140702\sdk\system-images\android-22\android-wear\armeabi-v7a\devices.xml cvc-complex-type…

单调队列优化的背包问题

对于背包问题&#xff0c;经典的背包九讲已经讲的很明白了&#xff0c;本来就不打算写这方面问题了。 但是吧。 我发现&#xff0c;那个最出名的九讲竟然没写队列优化的背包。。。。 那我必须写一下咯嘿嘿&#xff0c;这么好的思想。 我们回顾一下背包问题吧。 01背包问题 …

用Python去除扫描型PDF中的水印

内容概述 含水印扫描型PDF文件&#xff0c;其中某页如下图所示&#xff0c;用Python去除其页顶及页底的水印。 处理思路&#xff1a;PDF中的每一页的水印的相对位置基本相同&#xff0c;将PDF每一页输出成图片&#xff0c;然后进行图片编辑&#xff0c;用白色填充方形覆盖水印…

链表实现栈

栈&#xff0c;是操作受限的线性表&#xff0c;只能在一端进行插入删除。 其实就是带尾指针的链表&#xff0c;尾插 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define Status int #define SElemType int //只在头部进行插入和删除(…

二阶有源滤波器

滤波器是一种使用信号通过而同时抑制无用频率信号的电子装置, 在信息处理、数据传送和抑制干扰等自动控制、通信及其它电子系统中应用广泛。滤波一般可分为有源滤波和无源滤波, 有源滤波可以使幅频特性比较陡峭, 而无源滤波设计简单易行, 但幅频特性不如滤波器, 而且体积较大。…

用JS写了一个30分钟倒计时器

效果图 额外功能 左键单击计时器数字区&#xff0c;不显示或显示秒钟区。左键双击计时器数字区&#xff0c;暂停或启动计时器。计时完毕&#xff0c;只能刷新页面启动计时器。输入框可输入备注信息&#xff0c;输入框失去焦点或计时完毕后&#xff0c;时间戳附带备注信息会存入…