C#实现约瑟夫环算法
目录
1.约瑟夫环定义
2.约瑟夫环算法实现需要注意的地方
3.通过一个例子来演示这个过程
4.三人的约瑟夫环示例
4.十二人的约瑟夫环示例
1.约瑟夫环定义
约瑟夫环即设有n个人坐成一个圈,从某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人再次出列,如此反复循环,直到所有人都出列为止,最后按出列顺序输出。
实现约瑟夫环算法时,最重要的是约瑟夫环的流程。约瑟夫环应该有三个重要的参数、总人数、开始报数的人、第几次报数出列的人。
2.约瑟夫环算法实现需要注意的地方
在实现约瑟夫环问题时,有一点需要特别注意:当有人出列后,列表中的人数会减少,但下一个报数的起始位置(即index)应该基于剩余的人数进行更新。这意味着在每次有人出列后,我们都需要将index减1,然后再进行(index + 1) % people.Count的操作。
以下是约瑟夫环算法的逻辑:
- 初始时,index是起始位置(从index=0开始计数)。
- 在每次有人出列后,将index减1,以反映列表中人数的减少。
- 使用(index + 1) % people.Count来找到下一个报数的起始位置。
3.通过一个例子来演示这个过程
假设有3个人,起始位置是第2个人(index = 1),每次数到2的人出列。
初始状态:
- people = [1, 2, 3]
- index = 1(第2个人)
第一轮报数:
- 报数1:当前位置是2,不出列。
- 报数2:当前位置是3,出列。
- 更新people = [1, 2]
- 更新index = (2 - 1) % 2 = 1(因为第3个人出列了,所以剩下的人里第1个人成为新的起始位置)
第二轮报数:
- 报数1:当前位置是1,不出列。
- 报数2:当前位置是2,出列。
- 更新people = [1]
- 更新index = (1 - 1) % 1 = 0(因为第2个人出列了,所以剩下的人里第1个人成为新的起始位置,其索引0在编程中通常表示列表的第一个元素)
第三轮报数:
- 报数1:当前位置是1,不出列。
- 报数2:当前位置还是1,出列。(只剩一个人时要报两次数)
- 更新people = [](所有人都已经出列)
4.三人的约瑟夫环示例
// 3人的约瑟夫
class JosephusProblem
{static void Main(){int n = 3; // 总人数int m = 2; // 起始位置(从索引1开始计数)int k = 2; // 报数值List<int> people = [];for (int i = 1; i <= n; i++){people.Add(i);}int index = m - 1; // 转换为0基础的索引while (people.Count > 0){// 找到需要出列的人的索引index = (index + k - 1) % people.Count;// 出列该人并打印int outPerson = people[index];people.RemoveAt(index);Console.WriteLine("出列人的编号是:" + outPerson);}Console.WriteLine("所有人已出列。");}
}
//运行结果:
/*
出列人的编号是:3
出列人的编号是:2
出列人的编号是:1
所有人已出列。*/
4.十二人的约瑟夫环示例
始终使用index = (index + m - 1) % circle.Count;计算出下一个出列的人的索引。
// 约瑟夫环算法
namespace _149
{class Program{static void Main(string[] args){ArgumentNullException.ThrowIfNull(args);Console.Write("请输入人数n:");int n = int.Parse(Console.ReadLine()!);Console.Write("请输入报数间隔m:");int m = int.Parse(Console.ReadLine()!);Console.Write("请输入开始位置k:");int k = int.Parse(Console.ReadLine()!);List<int> circle = [];for (int i = 0; i < n; i++){circle.Add(i);}int index = k - 1;while (circle.Count > 0){index = (index + m - 1) % circle.Count;int outPerson = circle[index];circle.RemoveAt(index);Console.WriteLine("出列顺序:{0}", outPerson);}}}
}
//运行结果:
/*
请输入人数n:12
请输入报数间隔m:4
请输入开始位置k:3
出列顺序:5
出列顺序:9
出列顺序:1
出列顺序:6
出列顺序:11
出列顺序:4
出列顺序:0
出列顺序:8
出列顺序:7
出列顺序:10
出列顺序:3
出列顺序:2*/
相关文章:
C#实现约瑟夫环算法
目录 1.约瑟夫环定义 2.约瑟夫环算法实现需要注意的地方 3.通过一个例子来演示这个过程 4.三人的约瑟夫环示例 4.十二人的约瑟夫环示例 1.约瑟夫环定义 约瑟夫环即设有n个人坐成一个圈,从某个人开始报数,数到m的人出列,接着从出列的下一…...
游戏服务端配置“热更”及“秒启动”终极方案(golang/ygluu/卢益贵)
游戏服务端配置“热更”及“秒启动”终极方案 ygluu 卢益贵 关键词:游戏微服务架构、游戏服务端热更、模块化解耦、golang 目录 一、前言 二、异步线程加载/重载方案 三、配置表碎片化方案 四、指针间接引用 五、重载通知 六、示例代码 七、相关连接 一、…...
鸿蒙开发的入门
鸿蒙开发的入门 注册并实名认证华为开发者账户 华为官网 注册 有账户可以直接登录 并进行实名认证 下载并安装开发工具 鸿蒙开发使用的语言 java js c/c 仓颉 手机app java 硬件 c/c 应用开发工具的下载地址 Windows(64-bit) 下载地址 程序的运行过程 解析config.j…...
为什么要减少Http的请求以及如何减少Http请求
为什么要减少Http的请求 减少 HTTP 请求的数量是优化网页性能的一个重要策略,原因有以下几点: 1.延迟:每个 HTTP 请求都会有一定的网络延迟。即使数据量很小,请求和响应的往返时间也可能相当长,特别是在网络条件不好…...
Linux性能测试工具整理
性能测试工具:Unixbench lmbench stream iozone fio netperf spec2000 spec2006 一、unixbench unixbench主要是用于系统基础性能测试,unixbench也包含一些非常简单的2D和3D图形测试 UnixBench一个基于系统的基准测试工具,不单纯是CPU 内存 …...
前端路由history路由和hash路由的区别?原理?
前端路由是指在单页应用程序(SPA)中通过改变 URL 路径来实现页面切换和导航的机制。在前端开发中,有两种主要的前端路由实现方式:基于 History API 的路由(history-based routing)和基于哈希(Ha…...
AcWing 727. 菱形——像拼图一样做题
题目描述] 分析: 利用程序根据输入的整数,画出由字符*构成的该整数阶的实心菱形。给出一个示例: n 7 n7 n7。 * * * * * * * * * * * * * * * * * * * * * * * * * 我们将采取拆解问题,通过四个部分的…...
深入理解生成型大型语言模型:自监督预训练、细调与对齐过程及其应用
分析概述 本文主要介绍了生成型大型语言模型(LLM)的预训练过程,特别是通过下一个令牌(token)预测的自监督学习方法,以及后续的细调(finetuning)和对齐(alignment&#x…...
个人简历主页搭建系列-03:Hexo+Github Pages 介绍,框架配置
今天的更新内容主要是了解为什么选择这个网站搭建方案,以及一些前置软件的安装。 Why Hexo? 首先我们了解一下几种简单的网站框架搭建方案,看看对于搭建简历网站的需求哪个更合适。 在 BuiltWith(网站技术分析工具)上我们可以…...
【堆、位运算、数学】算法例题
目录 十九、堆 121. 数组中的第K个最大元素 ② 122. IPO ③ 123. 查找和最小的K对数字 ② 124. 数据流的中位数 ③ 二十、位运算 125. 二进制求和 ① 126. 颠倒二进制位 ① 127. 位1的个数 ① 128. 只出现一次的数字 ① 129. 只出现一次的数字 II ② 130. 数字范围…...
IDEA 多个git仓库项目放一个窗口
1、多个项目先通过新建module或者CtrlAltShiftS 添加module引入 2、重点是右下角有时候git 分支视图只有一个module的Repositories。这时候需要去设置把多个git仓库添加到同一个窗口才能方便提交代码。 3、如果Directory Mappings已经有相关项目配置,但是灰色的&…...
全球变暖(蓝桥杯,acwing每日一题)
题目描述: 你有一张某海域 NN 像素的照片,”.”表示海洋、”#”表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. .......其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就…...
多数据源 - dynamic-datasource | 集成 Quartz 及 ShardingJDBC
文章目录 集成 Quartz引入 quartz-starter配置数据源参数创建任务配置 Quartz 实际使用的数据源方式一: 自定义 SchedulerFactoryBeanCustomizer方式二: 使用@QuartzDataSource来指明quartz数据源集成 ShardingJDBC项目引入 shardingsphere 依赖分别配置shardingjdbc和多数据…...
四连杆机构运动学仿真 | 【Matlab源码+理论公式文本】| 曲柄滑块 | 曲柄摇杆 | 机械连杆
【程序简介】💻🔍 本程序通过matlab实现了四连杆机构的运动学仿真编程,动态展现了四连杆机构的运动动画,同时给出了角位移、角速度和角加速度的时程曲线,除了程序本身,还提供了机构运动学公式推导文档&…...
Lightroom Classic 2024 for mac 中文激活:强大的图像后期处理软件
对于追求极致画面效果的摄影师来说,Lightroom Classic 2024无疑是Mac平台上的一款必备软件。它凭借其强大的功能和出色的性能,赢得了众多摄影师的青睐。 软件下载:Lightroom Classic 2024 for mac 中文激活版下载 在Lightroom Classic 2024中…...
程序员下班以后做什么副业合适?
我就是一个最普通的网络安全工程师,出道快10年了,不出意外地遭遇到瓶颈期,但是凭技术在各大平台挖漏洞副业,硬是妥妥扛过来了。 因为对于程序员来讲,这是个试错成本很低、事半功倍的选择。编程技能是一种强大生产力&a…...
HSE化工应急安全生产管理平台:衢州某巨大型化工企业的成功应用
在化工行业中,安全生产一直是至关重要的议题。为了提高生产安全性、降低成本并提升企业形象,衢州某巨大型化工企业引入了HSE化工应急安全生产管理平台,取得了显著的改善和获益。 该平台的核心功能包括风险管理和应急预案制定。通过对化工生产…...
塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型
塑料工厂5G智能制造数字孪生可视化平台,推进塑料行业数字化转型。塑料制造行业作为重要的工业领域,亟需借助这一平台实现产业升级与转型,以适应市场的变化和提高生产效率。传统的塑料制造过程往往存在生产效率低下、资源浪费、环境污染等问题…...
HTML万字学习总结
html文本标签特殊符号图片音频与视频超链接表单列表表格语义标签(布局) html文本标签 标签简介<html></html>根目录<head></head>规定文档相关的配置信息(元数据<body></body>元素表示文档的内容<meta></meta>表示…...
Linux网络编程: 以太网帧Frame/ARP/RARP详解
一、TCP/IP五层模型 物理层(Physical Layer):物理层是最底层,负责传输比特流(bitstream)以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流,例如通过电缆、光纤或无线传输等。…...
OpCore-Simplify:如何通过自动化工具降低黑苹果配置的技术门槛
OpCore-Simplify:如何通过自动化工具降低黑苹果配置的技术门槛 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在非Apple硬件上安装macOS&…...
Whisper.cpp实战指南:在本地设备上构建高效离线语音识别系统
Whisper.cpp实战指南:在本地设备上构建高效离线语音识别系统 【免费下载链接】whisper.cpp Port of OpenAIs Whisper model in C/C 项目地址: https://gitcode.com/GitHub_Trending/wh/whisper.cpp 你是否曾想过在完全离线的环境下实现高质量的语音识别&…...
别再手动编译了!Ubuntu/Debian下apt一键安装配置METIS与ParMETIS(附Python接口pymetis示例)
告别源码编译:Ubuntu/Debian极简安装METIS与ParMETIS全指南 在科学计算和高性能计算领域,图划分算法扮演着至关重要的角色。METIS作为业界公认的标杆工具,其高效的划分算法和稳定的性能表现,使其成为许多分布式计算框架的基础组件…...
Mapbox踩坑实录:图层叠加、图片更新、弹窗样式,这些坑我帮你填平了
Mapbox实战避坑指南:图层管理、动态图片与弹窗优化 第一次在项目中集成Mapbox时,那种兴奋感很快被各种意想不到的报错消磨殆尽。记得凌晨三点调试updateImage方法时,控制台不断抛出"Image dimensions must match"的错误——原来只是…...
像素语言·维度裂变器效果展示:看平庸文本如何“裂变”成精彩内容
像素语言维度裂变器效果展示:看平庸文本如何"裂变"成精彩内容 1. 工具概览:16-bit像素风格的文本增强工坊 像素语言维度裂变器(Pixel Dimension Fissioner)是一款独特的文本增强工具,它将传统AI文本处理的工业感转化为充满游戏趣…...
从控制台到文件:用Fortran读写数据的完整流程(含read/write参数详解)
从控制台到文件:用Fortran读写数据的完整流程(含read/write参数详解) 在科学计算和工程仿真领域,数据持久化是构建可靠工作流的关键环节。Fortran作为高性能计算的基石语言,其文件操作能力直接影响着科研数据的处理效率…...
告别Unity打包卡顿:手动指定本地Gradle版本完整指南(以Gradle-6.1.1为例)
深度优化Unity构建流程:精准控制Gradle版本的完整实践指南 如果你曾经在Unity打包Android应用时遭遇过"Building Gradle project"卡顿的噩梦,那么这篇文章正是为你准备的。作为一名经历过无数次构建失败的开发者,我深知那种看着进度…...
AI XDR架构与威胁检测:网络安全智能化的下一个十年
总结AI XDR代表了网络安全智能化的重要方向,它能够大幅提升威胁检测的准确性和效率,帮助安全团队从繁重的告警处理中解放出来。但AI XDR并非银弹,需要与人的经验相结合才能发挥最大价值。关注安全,守护数字世界!...
【OpenCV 实战】LBP 统计直方图:从纹理特征到图像识别的关键一步
1. 为什么LBP统计直方图是图像识别的秘密武器? 第一次接触LBP(局部二值模式)时,我盯着那些黑白相间的纹理图看了半天——这不就是把像素点变成01编码吗?直到把统计直方图加进去,才发现这个组合简直是纹理识…...
STM32F407VG驱动OV7670摄像头(无FIFO版)保姆级教程:从接线到显示完整流程
STM32F407VG驱动OV7670摄像头(无FIFO版)保姆级教程:从接线到显示完整流程 当你第一次拿到OV7670摄像头模块时,可能会被它密密麻麻的引脚吓到。这款售价仅几元的摄像头模块,配合STM32F407VG开发板,可以构建一…...
