约瑟夫环问题一解

算法科普:什么是约瑟夫环 1 问题描述 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出圈;他的下一个人又从 1 开始报数,数到 m 的那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。 例如:有10个人围成一圈进行此游戏,每个人编号为 1-10 。... 阅读详情
问题描述:
约瑟夫环问题(Josephus)

用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。(约瑟夫环问题 Josephus)

解法思路:

建立一个有N个元素的循环链表,然后从链表头开始遍历并记数,如果计数i==m(i初始为1)踢出元素,继续循环,当当前元素与下一元素相同时退出循环。

代码:

#include <iostream>
using namespace std;

typedef int Item;
typedef struct node * plist;

typedef struct node {
	Item key;
	node * next;
} node;
plist CreateList(int N){
	/* plist head,curr,tail;*/
	plist head,curr,tail;
	int i;
	head = NULL;
	for(i=1;i<=N;i++){
		curr = (plist)malloc(sizeof(node));
		curr->key = i;
		curr->next = NULL;
		if(!head){
			head = curr;
			tail = curr;
		} else{
			tail->next = curr;
			tail = tail->next;

		}
	}
	tail->next = head;
	return head;
};

void DisplayList(plist lst){
	plist curr = lst;
	do{
		printf("%d\t",curr->key);
		curr = curr->next;
	}while(curr!=lst);
}

void DestroyList(plist lst){
	plist curr = lst;
	if(!lst) 
		return;
	plist nxt;
	do{
		nxt = curr->next;
		free(curr);
		curr = nxt;
	}while(curr!=lst);
}
void Josephus(plist lst,int M){
	if(!lst)
		return;
	plist curr,pre;
	int i = 1;
	curr = lst;
	pre = lst;
	while(curr){
		if(i==M){
			printf("%d\t",curr->key);
			pre->next = curr->next;
			free(curr);
			curr = pre->next;
			i = 1;
		}
		pre = curr;
		curr = pre->next;
		if(pre == curr){
			printf("%d\n",curr->key);
			free(curr);
			break;
		}
		i++;

	}

}
void main()
{
	plist lst = CreateList(7);
	DisplayList(lst);
	printf("\nJosephus:\n");
	//DestroyList(lst);
	Josephus(lst,2);
}



输出结果:

1	2	3	4	5	6	7	
Josephus:
2	4	6	1	5	3	7



约瑟夫环(Josephus Circle) 约瑟夫环(Josephus Circle)是一个数学的应用问题:已知 n 个人(分别用编号 0, 1, 2, ..., n - 1 表示)围坐在一张圆桌周围。从编号为 0 的人开始报数,数到 m 的那个人出圈,他的下一个人又从 1 开始报数,数到 m 的那个人又出圈,依次规律重复下去,直到剩余最后一个胜利者。 阅读详情

相关推荐

约瑟夫环问题(巧解)

巧解约瑟夫环问题(C/C++) 问题描述:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。 分析以上被杀掉的顺序: 第一轮:[1,2,3,4,5,6]  杀死序号为5的人,下一轮从序号为6的人开始; 第二轮:[1,2,3,4,6] 杀死序号为4的人,下一轮从序号为6的人开始; 第三轮:[1,2,3,6] ...

qq_42496432的博客 749

约瑟夫环问题

一、问题描述 约瑟夫环问题是一个很经典的问题:一个圈共有N个人(N为不确定的数字),第一个人的编号为0或者1(两个都可以,看你的程序如何编写),假设这边我将第一个人的编号设置为1号,那么第二个人的编号就为2号,第三个人的编号就为3号,第N个人的编号就为N号,现在提供一个数字M,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到M这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到M的人出局,直到N个人全部出局,请问,这个出局的顺序是什么? 举一个简单的例子:假.

xiaoxi_hahaha的博客 11万+

C语言实现约瑟夫环问题

1~N个人构成一圈,每个人手中有个号码,读入一个数T,从第一个人开始报数,报到T的人出圈;下一个人接着从1报数,报到出圈人手里的号码的人出圈,依次进行。 #include<stdio.h> void joseph(int data[], int n, int start, int m); void main() { int data[100]={0}; int i,num,t,st...

雩停 7552

约瑟夫环的三种解法(循环链表、数组和用数组模拟链表)

分别用循环链表、数组和用数组模拟循环链表解决约瑟夫环的问题

melonyzzZ的博客 3381

约瑟夫环问题 - Python

基本问题描述: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。(也类似于变态杀人狂问题)通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。通常,我们会要求输出最后一位出列的人的序号。那么这里主要研究的是最后一个出列的人的序...

jiangjiane 1万+

图解线段树解约瑟夫环问题

算导上有这样一道题,假设n个人站成环形,且有一个正整数m 例如,(7,3)-Josephus排列为(3,6,2,7,5,1,4)。 设计一个算法,时间复杂度要求O(nlogn)时间,使给定的整数n和m,输出(n,m)-Josephus排列。 对于约瑟夫环问题,如果是求最后一个出列的人,有O(n)的算法,这里就不介绍。 这里如果我们用循环队列来模拟的话,很明显时间复杂度是O(nm)的

fmt.Println( 4974

约瑟夫环问题详解

在牛客网上做到一道题,是约瑟夫环的变型,所以借此学习一下新知识,并且巩固一下对题目意思的理解,这一篇仅作约瑟夫环问题的解释,下一篇再写题目: 1.首先,我们先来了解一下什么是约瑟夫环问题: 讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后杀...

tingyun_say的博客 14万+

Java之约瑟夫环问题

通过学习Java约瑟夫环问题,理解大问题拆解成小问题,然后小问题之间递推求解,这也是动态规划的核心思想。

qq_43164662的博客 4905

约瑟夫环问题——一般解+数学模型递归解

约瑟夫环问题集合形式成环逻辑。约瑟夫问题是个有名的问题:N个人围成一圈,每个人都有自己对应的号数(号数从1到N),从1号开始报数(报数从数字1开始,轮到下一个人数字递增),当有人报数的数字为M将会被杀掉,下一个人接着从数字1开始报数,循环多次直到最后只剩下一个人,其余人都将被杀掉。如图所示,M为步长,先减掉6个人(arrayList.size()-left),在对8求余数,就等于2,表示杀集合中第2个,转换成下标2-1赋值给变量index,remove(index)。

Gojavaee的博客 2066

超实用!用ChimeraX对AlphaFold 结果可视化(中): 蛋白结构美化篇

而一般需要的背景颜色是无色(白色),有三种方法可以更改背景颜色,这里我们介绍两种方法,第三种在下一小节中讲解。如果想选中蛋白链中的某一结构区域或者某些位点,可以用Ctrl+Shift+鼠标左键,或在软件窗口中点击。在这个窗口中可以对蛋白的主链、侧链、表面等颜色进行修改,只用在。,即可在右下角看到我们蛋白的序列信息,在这里面直接用鼠标选择要选择的结构域。就会有更多的颜色供我们选择,如果有特定的色号还可以在这个界面继续选择。后面的颜色(②),就可以选择想要的任何背景颜色(③)。就可以选择软件推荐的常用颜色。

m0_63153079的博客 5483

【VisualStdio】手把手教你做一个上位机(1)控件设计布局

网上有很多形形色色的制作上位机教程,有些写的挺好的,但是过于单调。

m0_73409202的博客 5435

java数组解决约瑟夫环问题

@运用JAVA数组解决约瑟夫环问题 简单介绍一下约瑟夫环问题: 约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。 话不多说,代码献上,代码的注释比较好理解哈,有不懂的私戳我,看到就会回复哈! 代码: package com.airui; import java.util.Scan...

做梦的稻草人的博客 2745

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

参考文档1这个工具可以完美替代华硕奥创中心工具,可以定制化不同模式下的CPU、GPU、风扇转速、电池计划等。是由华硕开发人员开发的一个纯绿色的系统管理工具。直接展示启动后的工具界面效果图:这个工具也可以一键式停止正在运行的华硕ASUS服务,减少不必要的资源消耗。

追梦&天空的博客 1万+

约瑟夫环问题的数学分析解

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

flyapy 1085

Ubuntu安装有线网卡驱动

问题:插入网线后,无法识别有线连接。 原因:主板有线网卡的型号和系统中网卡的驱动不匹配 解决 前提条件: 需要连wifi通网,因为需要安装dkms,和下载驱动。 删除原驱动 1、查看网卡型号 lspci | grep net 我的网卡型号是8125 2、查看网卡驱动 lspci -k 网卡驱动是r8169 3、卸载网卡驱动 找出位置 modinfo r8169 | grep filename 然后删除 rm path/r8169.ko 卸载驱动 rmmod r8169 查看是否卸载成功 lsm

weixin_43932656的博客 1万+

库卡机器人外部轴配置全流程:从接线到WorkVisual 6.0实战(附避坑指南)

本文详细解析了库卡机器人外部轴配置的全流程,涵盖从硬件接线到WorkVisual 6.0软件配置的实战步骤。重点介绍了KPP驱动模块连接、电机参数匹配、安全配置激活及零点标定等关键环节,并提供了实用的避坑指南,旨在帮助工程师高效、安全地完成外部轴集成,提升工作站柔性。

weixin_29161785的博客 496

约瑟夫环问题的数学解

转载自:https://www.jianshu.com/p/6ee5c7b21333,在此基础上添加了一些自己的理解。 你和另外 n-1 个人围成一个圈,按 1,2,...,n 依次编号。第一个人从 1 开始报数,数到 k 的人会被杀掉,然后下一个人重新从 1 开始报数。如此往复,直到最后只剩下一个人。问题是,你应该如何选择自己的初始位置,才能保证最后不被杀掉呢? 速度越快的算法当然越好,...

weixin_30522183的博客 126

ROS入门教程(七)—— Gazebo与RViz联合仿真

通过Gazebo与RViz联合仿真实现机器人运动。

吾门的博客 1万+

Py递归算法解“约瑟夫环”的一种变形问题

Py递归算法 解“约瑟夫环” (“约瑟夫环”的一种变形问题) 题目: 约瑟夫环的一种变形。我们考虑的问题是开始时有n个人,记为1到n,站成一个圆圈。每一步,每第2个人将被去除,直到只剩下一个人为止。我们把剩下的人记为J(n),用程序求出1≤n≤16的J(n)(“约瑟夫环”点此跳转百科词条) 思路解析:   根据题意,要把人依序站队,数据结构选择数组(list)最为合适,用整数1~n来标识队列中人的初始站队位置。要让队列像贪吃蛇一样首尾相接成为圆圈,依list特性借助了list的pop和app

m0_57158496的博客 1389

华为OD机试双机位C卷-部门人力分配 (Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【部门人力分配】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 部门人力分配。

qq_45776114的博客 1873

基于EB工具的TC3xx_MCAL配置开发05_ADC模块硬件Pwm触发Demo配置

基于EB工具,硬件Pwm触发ADC采集Demo配置详细介绍

initiallizer的博客 3507

约瑟夫环问题 —— 算法

约瑟夫环问题前言约瑟夫环问题一约瑟夫环问题二约瑟夫环问题三约瑟夫环问题四约瑟夫环问题五约瑟夫环问题六约瑟夫环问题七约瑟夫环问题解决一 —— 模拟队列约瑟夫环问题解决二 —— 环形链表约瑟夫环问题解决三 —— 动态规划 前言 今天在浏览技术文章时看到的这么一个问题,感觉甚是有趣,专门来研究研究下,在浏览众多关于约瑟夫讲解的文章后,便进行一个较为详细的总结。 约瑟夫问题,是一个计算机科学和数学中的问题,在计算机编程的算法中,类似问题又称为约瑟夫环,又称“丢手绢问题”。约瑟夫问题在各大刷题网站有各种各

༄༊星河༣ 6308

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: 全排列的递归算法
下一篇: 判断大端或小端
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值