循环报数问题

N个人围成圈报数(经典例题约瑟夫环) /* * n个人(编号1~n)围成一圈从编号为1的开始报数,从1报数到m,报到m的人出来, * 下一个人继续重新从1开始报数,编程求最后一个留下的人的编号; * 如n=3,m=4; * 第一次出队:1; * 第二次出队:3; * 最后留下:2; */ > 解题思路:通过boolean数组,true与false的关系巧妙解决 代码如下: public static void main(String[] args) { Scanner sr=new Scanner(System.in); 阅读详情

/*
有N个人按照1到N编号围成一个圈做游戏,从第一个人开始从1报数,数到M的人退出游戏,他后面的人接着重新从1开始报数.问最后剩下的人是几号?
这个问题被称为约瑟夫(josephus)环问题。
最容易想到的方法是用一个循环链表来模拟游戏,直到最后只剩下1人.则可得到他的号码.
这种算法的空间复杂度是 O(N)
时间复杂度是 O(N*M)


下面给出一种算法,空间复杂度为 O(1),时间复杂度为 O(N)
这里只考虑M>=2的情况.

设总数为n的时候J(n,M)
则在总数是 n+1 的时候,第一次数到M,将减去1,以后的过程将和总数为n的情况一样。
所以 J(n+1,M) = (M+J(n,M))%(n+1)
这里的结果以0为基数,转换成以1为基数Josephus(M,N) = J(M,N) + 1;
显然:
如果 N=1 最后剩下的就是1号
所以
Josephus(1,M) = 1
J(1,M) = 0

示例程序:
*/
#include "stdafx.h"

long Josephus1(long N,long M);
long Josephus2(long N,long M);

int _tmain(int argc, _TCHAR* argv[])
{
 long N = 5;
 long M = 3;
 long Px1 = Josephus1(N,M);
 long Px2 = Josephus2(N,M);
 return 0;
}


//用循环
long J1(long N,long M)
{
 long k=0;
 for(long n=2;n<=N;n++)
 {
  k=(k+M)%n;
 }
 return k;
}


long Josephus1(long N,long M)
{
 return J1(N,M)+1;
}

// 用第归
long J2(long n,long M)
{
if(n==1) return 0;
else return (M+J2(n-1,M))%n;
}

long Josephus2(long N,long M)
{
 return J2(N,M) + 1;
}

 


报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,如此反复到所有人出列。 报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,如此反复到所有人出列。设n个人的编号分别为1,2,……n,打印出列的顺序。 【算法分析】 本题可以采用建立标志位的方法求解,但如果使用循环链的思想,则解题效率更高。n个人围城一圈,把一个人看成一个节点,n个人采用链接方式,即每一个节点有... 阅读详情

相关推荐

循环单链表解决循环报数问题

循环单链表解决循环报数问题 上海银行总行科技岗暑期实习生编程题目 有n(n>1)个人围成一圈循环报数,每次报到3就出列,剩下的人继续从1开始报数,直至只剩一个人,求剩下那一个人的原始编号。 #include<iostream> using namespace std; typedef struct node { int data; struct node* next; }Linklist; void baoshu(int m) { Linklist *L,*s,*r,*p; L

weixin_42666157的博客 720

约瑟夫环问题,n个人围成一圈,依次按1、2.....m来报数,报数值为m的人出圈,求最后出圈的人和出圈的序列

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

qq_39414417的博客 9729

用C++Vector和Queue解决循环报数淘汰问题

100人围成一个圈,每人有一个编码,编码从1到100。他们开始从1开始依次报数,报到M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人小于M。输出剩下的人原先的号码,M=3时为:58,91,M=4时为34,45,97.

u013611491的博客 1424

转圈报数问题(C语言):有n个人围成一圈,顺序排号……

问题描述: 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号那位。 题目分析: 这道题目是我们在日常生活中也能经常见到的一种报数小游戏。首先我们先分析一下游戏的核心——轮流报数 这个过程的本质是什么呢?我们分析一下游戏的过程。 我们先举一个实例:假如有5个人 分别为ABCDE 第一轮:A报1 B报2 C报3(被淘汰) D报1 E报2 第二轮:A报3(被淘汰)B报1 C(已被淘汰)D报2 E报3(淘汰) 第三轮:A(已被淘汰)B报1 C(已被淘汰)

Job20001213的博客 1万+

Java:解决循环报数,选班长的问题

题目: 按照一定的规则选举班长,规则如下:将班里的N个人围城一圈,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,然后从下一个人重新开始,最后留下的那个人就被选为班长,请问按照这个规则,选出的班长是原来编号为第几号的学生,假设班上有25个人。 这里我们说一下这个题的解析: 班级中有25个人,从第一个人开始报数 报数到3的时候将此人退出,下一人从1开始报,剩余最后一个人为班长。 这里我们用 int类型数组代表班级的同学。 int类型数组初始值为0 ,这里就默认为0是没有退出的同学。 定义一个变量

xiaozhuzhuyang的博客 594

CANoe软件之离线报文回放与分析实战

本文详细介绍了如何使用CANoe软件进行离线报文回放与分析,帮助工程师将现场故障数据转化为可反复研究的实验室资源。通过实战步骤,指导如何搭建分析工程、加载DBC文件解码信号,并利用Trace和Graphics窗口进行深度数据筛选与图形化分析,从而高效定位汽车电子故障,是提升诊断效率的关键技能。

weixin_29227585的博客 529

循环链表报数问题,n个人编号分别为1,2,3,……n,从第k个编号开始数1,2到m个然后删除第m个人,然后下 一个人再从1开始数数到第m个,然后再删除m人

#include #include using namespace std; //循环链表报数问题,n个人编号分别为1,2,3,……n,从第k个编号开始数1,2到m个然后删除第m个人,然后下 //一个人再从1开始数数到第m个,然后再删除m人 struct Lnode { int data; Lnode *link; }; void josephus(int n,int k,in

a925907195的专栏 4676

Adams软件安装与配置全攻略:从入门到机器人仿真

机械系统动力学仿真软件Adams是工业机器人开发的重要工具,其安装过程涉及许可证配置、环境变量设置等关键技术环节。专业仿真软件安装通常需要处理系统兼容性、组件依赖和授权验证等工程问题,特别是在机器人控制仿真等场景中,还需集成MATLAB/Simulink等第三方工具。本文以Windows平台为例,详解Adams安装的核心步骤,包括系统环境检查、许可证服务器配置、工业机器人专项模块安装等实践要点,并针对NVIDIA Quadro显卡优化、27500端口通信等常见问题提供解决方案,帮助用户快速搭建可靠的仿真环境

weixin_28523493的博客 199

循环报数问题 Java

题目: 有1-n个人围成一圈,从头开始循环报1-3,报到3的人出局,求最后剩下的那个人。 package cyclic.count; import java.util.Scanner; /* * 循环报数问题:有1-n个人围成一圈,从头开始循环报1-3,报到3的人出局,求最后剩下的那个人。 */ public class Count { public static void main(S...

qq_41030039的博客 1713

YOLOv10改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤

本文记录的是。采用深度可分离卷积将标准卷积分解为深度卷积和1×1卷积。同时,引入来,避免非线性层导致的性能下降问题。本文将应用到YOLOv10中,借助其高效的结构和特性,在保持一定精度的前提下,显著降低YOLOv10的计算复杂度和内存占用。

Limiiiing的博客 532

TI单芯片毫米波雷达1642代码走读(〇)——总纲

前言 近年来,自动驾驶行业发展如火如荼,雷达技术也逐渐从军工封闭圈走向了开放的市场。 毫米波雷达具有全天候探测能力,特别是在雨雪雾天气以及夜间都能可靠工作,并且探测距离相对其他车载传感器非常远,对运动目标非常敏感,价格还低廉,这些特性都使其成为自动驾驶感知层面不可或缺的一环。 现如今的雷达已经不仅仅局限于测距测速测角等传统的功能,雷达技术正在从感知走向认知、从宽带走向超宽带、从二维走向三维四维、从相控阵走向数字阵列、从单通道走向MIMO、从独立工作走向分布式协同、从分立组件走向射频数字一体化。MIMO

3万+

c语言报数问题程序,C语言有关问题,关于循环报数

C语言问题,关于循环报数#includemain(){intcircle[17]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};intcall;intnumber;inti;number=17;call=1;while(number>0){for(i=1;i<=17;i++){if(call%3!=0&&circle[i]...

weixin_30741285的博客 543

锂电池的充电和放电曲线解读

锂电池充放电曲线是反映其性能的关键指标。充电曲线分为恒流和恒压两阶段:恒流阶段电压快速上升,恒压阶段电流逐渐降低;放电曲线则呈现平台期和快速衰减期特征。这些曲线受温度、充放电倍率及材料体系(如三元锂或磷酸铁锂)显著影响。通过分析曲线特征,可优化电池管理系统,实现精准的SOC估算、快充策略制定及故障诊断,从而在电池性能与安全性间取得平衡。不同应用场景(如新能源汽车或消费电子)对曲线形态有特定要求。

start_up_go的博客 5066

数据结构 循环队列的实现与应用举例:报数问题

循环队列是一种常见的队列实现方式,各个数据元素依次存储,并设置两个指针,分别指向队头和队尾,在插入和删除数据时,队头指针和队尾指针会循环使用存储空间。应用队列可以解决报数问题。 报数问题:设有n个人站成一排,从左向右的编号分别为1~n, 现在从左向右报数“1,2,1,2,1,2….”,数到”1”的人出列,数到”2”的人站到队伍最右边。报数过程反复进行,直到n个人都出列为止。 分析:可以创建一个队列存储各个数据。左边相当于队头,右边相当于队尾。左边的人报数相当于从队列中取出队头元素并删除队头元素。站到队伍

xifengcode 3375

C#实现OPC客户端与S7-1200 PLC通信:工控场景稳定通信的实战指南(附完整代码)

标准化优先:OPC UA是工业通信的标准,相比直接通信,更适合多设备集成的工控场景;稳定性第一:必须封装断线重连、异常处理、资源释放逻辑,满足7×24小时运行需求;效率优化:高频采集场景优先用批量读写,避免单个变量频繁请求;细节把控:节点ID、变量类型、端口配置等细节是新手最容易踩坑的地方,建议先用UA Expert验证。这套代码和方案已在多个工业项目中落地,从单台S7-1200到多台S7-1200/1500集群,都能稳定运行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1035

【SWAT】SWAT中预定义河网及流域

平原圩区没有明显的海拔差异。DEM中包含的地形信息无法定义河段的位置和水文连接,SWAT模型Watershed Delineator中提供两种方法,帮助用户输入流域拓扑信息。第一种方法,“Burn-in”和手动绘制河段和子流域边界。首先,使用“Burn-in”功能导入数字河道网络(DCN),并根据DEM和DCN绘制河流和子流域。然后在ArcGIS中编辑“流域”和“河段”层,可以调整位置、范围和水文连接。第二种方法,可以手动绘制或重新编辑河流和子流域,预定义河网及流域。

```On Earth, Be Water, By Coding``` 3273

报数问题,循环淘汰特定的数(C语言)

题目描述 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。 输入 初始人数n 输出 最后一人的初始编号 样例输入 3 样例输出 2 #include<stdio.h> int main() { int M=3; int i,k=0,num[128],n,m=0; //k来计算总共淘汰的人数,a[1000]存储人数,n为总共的人数,

玖玖的博客 1180

S/4HANA Private Cloud 与 On-Premise 的 Key User Custom Fields 运输与升级避坑指南

本文探讨了SAP S/4HANA Cloud Private Edition和On-Premise系统中Key User Custom Fields的管理要点。文章指出,Custom Fields涉及元数据生成、对象一致性、传输治理等完整链路,操作不当会导致字段丢失或升级失败。关键建议包括:使用ATO Fiori App管理扩展项与传输绑定,配置正确的job user权限,避免在多系统并行开发同一字段。特别强调升级时需执行CFD_REGENERATE_IN_ONPREMISE报表,并通过标准传输机制推进变更

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 195

循环报数 java_[蓝桥杯][java]循环报数问题

package com.luojin.lanqiao.java; import java.util.Vector; /* * 【Java 组代码填空】 有 n 个孩子站成一圈,从第一个 孩子开始顺时针方向报数,报到 3 的人出列,下一个人继续从 1 报数,直到最后剩下一个孩子为止。问剩下第几个孩子。下面的程序以 10 个孩子为例,模拟了这个 过程,请完善之 (提示:报数的过...

weixin_29042035的博客 328

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

用循环链表解决报数淘汰问题

100人围成一个圈,每人有一个编码,编码从1到100。他们开始从1开始依次报数,报到M的人自动退出圈圈,然后下一个人接着从1开始报数,直到剩余的人小于M。输出剩下的人原先的号码,M=3时为:58,91,M=4时为34,45,97.

u013611491的博客 2217

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C语言循环报数问题

#include"pch.h" #include <stdio.h> void main() { int number = 0; int m = 6; int n = 0; int a[200]; int p[200]; for (int i = 0; i < m; i++) { a[i] = i + 1; } for (int j = 0; ;) { i...

学习记录 7590

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

小孩报数问题(循环链表)

题目描述有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。输入第一行输入小孩的人数N(N&lt;=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W &lt; N),用逗号","间隔输出按人名...

xiaoxiaokeke_的博客 2051

题目:循环链表之报数问题(C,Josephus问题,算法学习ing)

2020.5.31 昨天没写出来 今天翻了书,才写出来。。。。 题目:循环链表之报数问题 ​ 设有 n 个人围坐在一个圆桌周围,现从第 j 个人开始报数,数到第 k 的人出列,然后从出列的下一个人重新开始报数,数到第 k 的人又出列,如此反复,直到所有的人都出列。输出按出列顺序得到的n个人员的序列 #include<stdio.h> #include <malloc.h> typedef struct link { int num; struct link* next; }Pe

Blackzeus的博客 845

循环删除报数问题

给定n个排成一圈的人,他们依次循环报数:1,2,。。。,m;当报到m时,这个人就被踢出队伍。 比如:n=6,m=3;那么将依次踢出:3,6,4,2,5,1 算法:输入n,m 输出:按被踢出顺序输出踢出的人 思路:利用链表,指针p每次删除元素前调用p=p->next m-1次,利用循环链表表示“圈”  void circleDelete(int n, int m){ struct myl

wangxugangzy05的专栏 950

软件开发笔试心得一:循环报数,圆圈报数,约瑟夫问题

最近一段时间一直在找工作,没有心思写心得。今天刚好从淳中视讯面试回来,有一道题很有意思。 1. n个人围成一个圆圈,从1到3开始报数,报到3的人出去,这样一直循环,直到只剩下一个人。问剩下的人在开始报数之前的编号?   当时我想的是直接用循环链表来模拟整个报数的过程,即构造一个n个数的循环链表,进行循环遍历,每当数到3时删除当前指向的节点,直到剩下最后一个。 但是该算法比较复杂,肯定还有简

wzdark的专栏 3528

约瑟夫环->循环报数问题

约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载, 加上风浪大作,危险万分。因此船长告诉乘客,只有将全船 一半的旅客投入海中,其余人才能幸免于难。无奈,大家只 得同意这种办法,并议定30 个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海中,然后再从 他的下一个人数起,数到第9人,再将他投入大海中,如此 循环地进行,直到剩下 15 个游客为止。问:哪些位置是将 被扔下大海的位置...

Time Will Tell 1461
上一篇: 防止对话框程序按Enter和ESC退出
下一篇: 指针和数组的区别----extern
双杯献酒
博客等级 码龄25年 102粉丝 134原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值