java约瑟夫环迭代器_Josephus约瑟夫环问题的不同实现方法与总结

/************************************************************************/

/*                  Josephus问题——数组实现                          */

/************************************************************************/

#include

#include

int Josephus(int times, int number, int id){

int *a;

int i, count = 0, t = 0;

a = (int *)malloc(sizeof(int) * number);

for(i = 0; i < number; i++)

a[i] = i + 1;            // 数组a用于储存每个元素的编号

i = id - 1;

while(count < number - 1){

if(a[i] != 0)

t++;

if(t == times){

t = 0;

count++;

printf("%4d", a[i]);

a[i] = 0;                // 当该元素被剔除时,该数组元素置为0

}

i++;

if(i == number)

i = 0;

}

for(i=0;i

if(a[i]!=0)

{

printf("\n最后剩余的结点是:%4d\n",a[i]);

return;

}

}

int main(){

int times, number, id;

printf("请输入总人数:");

scanf("%d", &number);

printf("请输入报数周期:");

scanf("%d", &times);

printf("请输入开始报数的编号:");

scanf("%d", &id);

Josephus(times, number, id);

return 0;

}

/************************************************************************/

/* 总结:

优点为可以得出每次被剔除的元素编号

缺点为内存空间占用较大,没有数学归纳法快速                        */

/************************************************************************/

/************************************************************************/

/*                  Josephus问题——循环链表实现                      */

/************************************************************************/

#include

#include

typedef struct LNode

{

int data;

struct LNode *next;

}LNode,*Linkhead;

void Josephus(int m,int n,int k)

{

Linkhead p,r,head = NULL;

int i;

for(i = 1;i <= n;i++)

{

p = (Linkhead)malloc(sizeof(LNode));//申请一个新的链结点

p->data = i;//存放第i个结点的编号

if(head == NULL)

head = p;

else

r->next = p;      // 因为Insert和Del操作都需要之前一个节点的地址,故用r来存储。其作用类似栈的top

r = p;

}

p->next = head;//至此,建立一个循环链表

p = head;

for(i = 1;i < k;i++)

{

r=p;

/*请注意,此行不是多余的,因为当k!=1,但m=1时如果没有这条语句,此时删除动作无法完成*/

p=p->next;

}        //此时p指向第1个出发结点

while(p->next != p)

{

for(i = 1;i < m;i++)

{

r = p;

p = p->next;

}                        //p指向第m个结点,r指向第m-1个结点

r->next = p->next;        //删除第m个结点

printf("%4d",p->data);    //依次输出删除结点的编号

free(p);                //释放被删除结点的空间

p = r->next;            //p指向新的出发结点

}

printf("\n最后剩余的结点是:%4d\n",p->data);//输出最后一个结点的编号

}

int main(){

int times, number, id;

printf("请输入总人数:");

scanf("%d", &number);

printf("请输入报数周期:");

scanf("%d", &times);

printf("请输入开始报数的编号:");

scanf("%d", &id);

Josephus(times, number, id);

return 0;

}

/************************************************************************/

/* 总结:

优点为可以得出每次被剔除的元素编号

缺点为相较数组方法需要更多的计算量

总体而言与数组方法相差无几                                        */

/************************************************************************/

/************************************************************************/

/*            Josephus问题——数学归纳法直接计算                      */

/************************************************************************/

#include

int main() {

int answer = 0;

int times, number, i, id;    // number为环内总元素个数,times为报数周期, id为从第几个元素开始报数

printf("请分别输入总人数和循环次数:");

scanf("%d %d", &number, &times);

printf("起始报号者的编号:");

scanf("%d", &id);

for(i = 1; i <= number; i++) {

answer = (answer + times) % i;      // 核心算法,利用数学归纳法得出

}

if(answer + id == number)

printf("Survial: %d\n", number);    // 防止当幸存者为最后一个编号时输出0的情况

else

printf("Survival: %d\n",(answer + id) % number);

// 这边利用number对answer进行取余操作以防止编号数值超过最大编号(溢出)

return 0;

}

对于Josephus问题有两个地方是可以进行优化的。 (总人数为N,编号为从0~N-1;经过M次报数去除一个成员,剩余成员个数为numleft, 记M%numleft为mPrime)

1、被移除的成员离上一个成员之间的距离是M%numleft-1(报数次为M%numleft).当M大于N时,该计算方式将节省大量时间

2、当mPrime大于numleft的时候可以反向遍历该表来查找要去除的成员。这样可以节省时间。同样这也就要求了该表必须是一个双向表才行。(即含有Previous方法)

该算法实现原理即为:

第一轮,必定为编号M%N-1的成员被去除,第二轮为在第一轮的基础上即从编号为M%N的成员开始正移mPrime-1个单位(或者反移numleft-mPrime-1个单位)。若将M%N即为编号0,开始重新编号,那么第二轮被删除的成员编号便是M%(numleft)-1,由此可得该轮要被删除的成员与上一轮去除成员之间的距离为M%numleft,这里可利用迭代器来实现。

这里我们便可以得到成员编号与该轮成员数目的关系是:(n表示该轮所剩余的成员数目,Index(n)表示该轮成员的编号(从0开始))

Index(n) = (Index(n - 1) + m) % n。

那么按照这个过程,我们这样一直移除元素下去,肯定能够找到最后一个被移除的元素。

这个元素则对应只有一个元素的环,很显然,它的值为0。也就是Index(1) = 0。

对于这个元素的索引,它对应两个元素的索引是多少呢?

按照前面的过程,我们倒推回去就是了。Index(2) = (Index(1) + m) % 2。

那么对应3个,4个元素的呢?我们这样一路继续下去就可以找到对应到n个元素的索引了。

所以,我们发现了一个有意思的数学归纳关系:

f(1) = 0,  f(n) = (f(n - 1) + m) % n。

按照这个关系,我们可以得到最后一个被取出来的元素对应到n个元素的环里的索引值。

至此,我们可以发现,利用count计数从而删除成员的方法与此相比起来逊色不少,故之后我们将采用此方法来解决问题。

该问题的最终解决程序可参见另一篇文章: Java实现 Josephus约瑟夫环问题  http://www.linuxidc.com/Linux/2017-05/144055.htm

0b1331709591d260c1c78e86d0c51c18.png

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

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

相关文章

ios 下拉放大 上拉缩小_为啥鞠婧祎发量这么多?截图放大十倍她的“发缝”,网友:真密集...

​鞠婧祎&#xff0c;这位女明星真的是黑&#xff0c;红&#xff0c;黑&#xff0c;红。这不是秘密。鞠婧祎最近几天的确很受欢迎。甚至头发也受到质疑。一般而言&#xff0c;娱乐业的演艺人员由于多年来的工作时间安排不规则以及采取巴拉克拉法帽的行为&#xff0c;通常都有使…

opencv4.5.0安装包_UG NX12.0 软件介绍(附安装包)

【软件名称】 UG NX12.0【文件大小】 5.67GB 【语言支持】 简体中文【系统类型】 64位【兼容系统】 Win7 / Win8 / Win10【下载链接】 文末扩展链接获取软件简介&#xff1a;西门子公司推出了最新版的Siemens NX 12.0版本(UG12.0)&#xff0c;该软件提供了当今市场上唯一可扩展…

win7备份工具_win7系统小白一键系统详细教程

很多朋友给小白留言说&#xff0c;使用了新版小白的一键备份后&#xff0c;不知道如何还原系统。体验过新版的朋友们最大的感受就是这个工具越来越小了。接下来&#xff0c;win7系统的一键还原将为您带来一个详细的教程。在系统一键备份方面&#xff0c;如何减少系统一键还原&a…

iis php网站500错误原因_如何解决iis php 500错误问题

iis php500错误的解决办法&#xff1a;1、打开PHP.ini&#xff0c;设置显示错误&#xff1b;2、把“require(./xxx.php)”改成“require(xxx.php)”&#xff1b;3、给网站的上级目录赋予iis用户读权限即可。推荐&#xff1a;《PHP视频教程》本方法适用于任何品牌的电脑。IIS 配…

win10右键一直转圈_Win10总是自动更新?教你如何关掉自动更新

小白系统免费的人工客服点击联系win10怎么关闭自动更新呢&#xff1f;平时不定期的对系统进行更新虽然可以给让我电脑的运行变得更加流畅&#xff0c;但是&#xff0c;不少用户却遇到了win10更新之后不兼容等一系列的问题&#xff0c;因此&#xff0c;就都将要将自动更新功能关…

springboot 中文文档_还在用 Swagger生成接口文档?我推荐你试试它

JApiDocs是一个无需额外注解、开箱即用的SpringBoot接口文档生成工具。编写和维护API文档这个事情&#xff0c;对于后端程序员来说&#xff0c;是一件恼人但又不得不做的事情&#xff0c;我们都不喜欢写文档&#xff0c;但除非项目前后端代码都是自己写的&#xff0c;否则API文…

wringPi 初始化GPIO 为上拉_玩转GPIO之PWM点亮呼吸灯(非树莓派)

在这篇文章&#xff0c;我介绍了基于逸宸电子开发的总线适配器来点亮LED灯的基本方法&#xff01;myastrotong&#xff1a;玩转GPIO之点灯&#xff08;非树莓派&#xff09;​zhuanlan.zhihu.com这款总线适配器的介绍见这里&#xff1a;工业级高速USB转SPI I2C PWM GPIO UART C…

dnf如何快速拾取物品_DNF手游泰拉该如何获取,游戏蜂窝辅助托管快速获取泰拉...

在DNF手游中&#xff0c;一共存在三种的核心货币——点券&#xff0c;泰拉还有金币。点券是用来买商城道具的主要流动货币&#xff0c;金币则是用来打造装备的&#xff0c;而泰拉是有两种货币的共同点&#xff0c;所以它既能在商城购买各种道具&#xff0c;又能兑换金币。所以说…

java商城_java网上商城系统怎么样?优势又有哪些?

导读&#xff1a;大家都知道Java是一款非常实用的开发语言&#xff0c;而通过Java开发的商城吸引也因为其强大安全性能与使用性能等优势受到了很多企业商家的青睐&#xff0c;那么一款功能丰富的Java商城系统也自然成为...大家都知道Java是一款非常实用的开发语言&#xff0c;而…

php socket keepalive,linux keepalive探测对应用层socket api的影响

问题大部分人都知道tcp的keepalive. 假设读者知道keepalive会如何触发. 这篇文章想讨论keepalive触发后, 对socket使用者的影响.keepalive设置修改/etc/sysctl.confubuntu# vim /etc/sysctl.confubuntu# sysctl -pfs.file-max 131072net.ipv4.tcp_keepalive_time 10net.ipv4.…

qt 文字倾斜投影_帅呆!钢铁侠中的激光投影键盘终于量产了,炫酷又好用

看过电影《钢铁侠》的朋友&#xff0c;估计都会被钢铁侠的各种黑科技所折服&#xff0c;比如钢铁装甲、全息投影、人工智能贾维斯等等。不过这些黑科技想要实现还需要一段时间。但其中有一项黑科技已经被国产厂商实现了&#xff0c;那就是——激光投影键盘。早在去年&#xff0…

手机投电脑_把王者荣耀投屏到电脑上玩更爽哦——投屏神器幕享

今天给大家介绍一款投屏神器&#xff0c;它叫做幕享。直接摆观点——现今最好用的投屏工具&#xff0c;没有之一&#xff01;它是全平台都有的软件哦&#xff0c;这意味着除了电脑&#xff0c;你还可以在安卓市场和Appstore下载到它。三个平台都有意味着什么呢&#xff0c;心细…

清华大学镜像_国内开源镜像站信息盘点

一、前言开源镜像站点是一个放置开源系统镜像文件的站点&#xff0c;免费提供镜像文件下载服务&#xff0c;可以刻盘也可以直接用虚拟光驱安装操作系统、开源软件、Linux源码网站。目前&#xff0c;各大高校都纷纷建立了自己的镜像站&#xff0c;一些有实力的大厂也开始为开源事…

labview圆环里实物动画图形_有趣的图形教案

有趣的图形教案作为一名优秀的教育工作者&#xff0c;通常会被要求编写教案&#xff0c;教案是保证教学取得成功、提高教学质量的基本条件。怎样写教案才更能起到其作用呢&#xff1f;以下是小编为大家整理的有趣的图形教案&#xff0c;希望对大家有所帮助。有趣的图形教案1活动…

安卓 图像清晰度识别_螺柱焊位置识别算法初稿

为了保证螺柱焊接时&#xff0c;螺柱焊接位置和螺柱所在凸台偏差太远带来的抱怨&#xff0c;打算采用图像识别的方法识别螺柱在所焊接凸台位置是否居中&#xff1b;在凸台上的的螺柱焊通过计算凸台圆弧的圆心和螺柱的圆心偏差来判断螺柱是否在凸台的中心&#xff0c;分以下几个…

电脑音频服务未运行怎么解决_电脑故障维修技巧教程:新手必看的修电脑技巧!...

日常生活工作中&#xff0c;我们的电脑总会出现各种各样的问题&#xff0c;如果掌握了一定的通用修电脑技巧&#xff0c;除了可以解决问题&#xff0c;说不定还能得到帮女神修电脑的机会&#xff0c;俗话说的好&#xff0c;电脑修的好&#xff0c;对象少不了&#xff01;电脑故…

vue 保留小数点厚一位_2019黑龙江公务员考试行测资料分析:保留有效数字巧解对位数相乘...

在行测考试中&#xff0c;资料分析是很重要的一部分&#xff0c;同学们也都知道这一部分是绝对不能放弃的。资料分析在做题的时候无非就是找数据、列式&#xff0c;最后再计算&#xff0c;那么这个时候问题就来了&#xff1a;数据找得到&#xff0c;列式也能列得对&#xff0c;…

cad计算总长度插件_超实用的CAD插件大合集,视频教程手把手教学,工作效率翻倍...

超实用的CAD插件大合集&#xff0c;视频教程手把手教学&#xff0c;工作效率翻倍&#xff01;今天被单位新来的实习生给上了一课&#xff0c;才知道原来CAD还有这么多好用便捷的插件。我厚着脸皮要来一份试了一下才体验到快速制图的快乐&#xff0c;这些全是平时制图能用得上的…

在linux操作系统Centos上安装服务器相关软件

如果您的服务器没有图形界面(GUI),您可以通过命令行(终端)来安装和配置Tomcat、JDK和MySQL等软件。以下是在没有图形界面GHome的 Linux 系统上安装这些软件的基本步骤: 对于CentOS Stream 9,您可以按照以下步骤在命令行上安装Tomcat、JDK 和 MySQL 数据库: 1. 安装JD…

rpc 服务器不可用_RPC和微服务

RPC全称Remote Procedure Call&#xff0c;即远程过程调用。其本质上其实就是主机A通过某种网络协议向支持相同协议的主机B发送一个任务执行命令&#xff0c;并且在某些情况下&#xff0c;还能支持任务执行结果的返回。几乎每一个RPC都有着自己的网络协议定义&#xff0c;如果要…