约瑟夫环问题的解决

使用数组解决约瑟夫环问题 package com.zzb.datastructure.singlelist; /** * @Auther: Administrator * @Date: 2020/1/17 15:31 * @Description: 使用 数组 解决 约瑟夫环 问题 * * 问题描述: * total 个人围成一圈,从第 index 个人起从 1 开始报数,数到 target 的那个人出队,... 阅读详情

约瑟夫环问题介绍:

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



# include <stdio.h>
# include <stdlib.h>
# include <assert.h>
typedef int DataTp;

typedef struct node
{
    DataTp elem;
    struct node*pnext;

}NODE;

typedef NODE* LinkList;



NODE* CreatList(int n);
void MakeLoop(LinkList phead);
void DeleteNode(LinkList phead,LinkList paim);

int main (void)
{
    int sum,num;  //总人数 , 退出人的编号
    int i;
    
    LinkList pstart;  //头节点 
    LinkList paim;    //待删除的目标节点的地址 
    LinkList pt;      
    
    puts("输入总人数");
    scanf("%d",&sum);   
    puts("输入退出的编号");
    scanf("%d",&num);

    pstart=CreatList(sum);  //建立链表
    MakeLoop(pstart);       //变为循环链表
    
    pt=pstart->pnext; //取出第一个数据节点地址
    
    while(sum!=0) 
    {

        for(i=0;i<num-1;i++)
            pt=pt->pnext;      //往后寻址,找到退出目标的地址
     
        paim=pt;              //临时保存。确定删除节点的地址 
        pt=pt->pnext;         //确定下次循环的头为pt
        
        printf("退出的是%d号\n",paim->elem);
        DeleteNode(pstart,paim);         //删除
           
        sum--;                          //总人数减少

    }
    
   
    return 0;
}


NODE* CreatList(int n)
{
    int i;
    NODE*p1,*p2;

    NODE * phead;
	
	phead=(NODE*)malloc(sizeof(NODE));
	if(phead==NULL)
	{
		fputs("memory error!\n",stderr);
        exit(EXIT_FAILURE);
		
	} 
	
	phead->pnext=NULL;
	
	
    /////////////////////////////////
    for(i=0;i<n;i++)
    {
        p1=(NODE*)malloc(sizeof(NODE)); //分配内存
        if(p1==NULL)                    //检查合法性
        {
           fputs("memory error!\n",stderr);
           exit(EXIT_FAILURE);
        }
        p1->elem=i+1;                  //补全结点信息
        p1->pnext=NULL;

        if(phead->pnext==NULL)         //链接
             phead->pnext=p1;
        else
             p2->pnext=p1;

        p2=p1;                          //重置
    }


   return phead;
}


void MakeLoop(LinkList phead)
{
    NODE*p=phead->pnext; //取出第一个数据节点 
    
    assert(p!=NULL);
    
    while(p->pnext!=NULL)
         p=p->pnext;
         
    p->pnext=phead->pnext;   // 链接,构成循环链表

    return ;
}

void DeleteNode(LinkList phead,LinkList paim)
{


    NODE*p=phead->pnext;  //取出第一个数据节点 
    
    assert(p!=NULL);
    
    while(p->pnext!=paim)
        p=p->pnext;
    
    p->pnext=p->pnext->pnext;
    
	if(paim==phead->pnext)   //如果删除的是第一个数据节点, 
	  phead->pnext=p->pnext; //改变头节点指针域的值,使它始终指向 
	                         //循环链链表的某一个节点。而不丢失链表节点                                                        
    free(paim);
    return ;
}




链表初始状态:

刚开始写这个程序的时候,遇到一个Bug,那就是没有解决链表丢失问题。比如当退出的节点刚好为1号节点时

,1号节点就会被Free掉,这样就不能通过phead来访问各个节点了,整个链表就丢失了。

于是我在DeleteNode()函数里加了一个判断:当删除节点为第一个数据节点时,更改头节点的指针域的值,

使指向第一个数据节点的下一个节点,这样链表就不会丢失了。







【Envi风暴】Envi5.6安装图文教程(附Envi5.6完整版下载) 【Envi风暴】Envi5.6与应用商店app store安装图文教程(附Envi5.6完整版下载)从文末网盘下载完整的ENVI5.6安装包,如下所示:双击envi56-win.exe,开始安装。将f__x64下的两个补丁文件拷贝到安装路径。将f__x86下的两个补丁文件拷贝到安装路径。 阅读详情

相关推荐

用Python模拟随机游走:从一维到三维,直观理解马尔可夫链的常返性

本文通过Python模拟一维到三维的随机游走,直观展示马尔可夫链的常返性特性。使用NumPy和Matplotlib构建模拟器,揭示不同维度下随机游走的返回概率差异,帮助读者理解为什么一维和二维游走具有常返性,而三维游走可能永远迷失。文章包含完整的代码示例和可视化技巧,适合概率论和Python编程爱好者学习实践。

weixin_28694295的博客 402

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

题目: /* 2、已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编为k的人开始报数,数到m的那个人出列; 他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。    输入:n= 9,k= 1, m=5    输出:5,1,7,4,3,6,9,2,8 */ public class Two127 { public static void main(String[] args) {

y_bra_ke的博客 2269

如何快速下载Gaia DR3星表数据?中国虚拟天文台镜像站保姆级教程

本文提供了一份详细的保姆级教程,指导用户如何通过中国虚拟天文台镜像站高速、稳定地下载Gaia DR3星表数据。文章详细介绍了镜像站的访问地址、数据组织结构,并给出了使用wget、aria2c等工具进行批量下载的实战策略,帮助国内用户避开国际网络延迟,高效获取近20亿颗天体的海量数据。

weixin_29231263的博客 307

【数据结构】约瑟夫环问题:循环链表的应用(C++版)。 已知n个人(以编号1, 2, 3...n 分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报。

循环链表的应用:约瑟夫环问题一、实验目的: 熟悉循环链表的定义,建立方法及相关基本操作,理解循环链表的基本思想。二、实验要求: 算法完善,考虑时间复杂度。三、实验内容: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到只剩下一个人为止。 输入:n,m(m<n) 输出:剩下最后一个人的编号 #include <iostream> u...

qq_52978240的博客 3644

告别虚拟机!用ZYNQ7000和PYNQ 2.6.0打造一个能实时识别人脸的“智能摄像头”

本文详细介绍了如何利用Xilinx ZYNQ7000开发板和PYNQ 2.6.0框架构建实时人脸识别系统。通过硬件加速和嵌入式开发技术,该系统实现了低延迟、低功耗的独立运行能力,适用于边缘计算和物联网应用。文章包含从环境搭建到核心功能实现的完整指南,并提供了性能优化和问题排查的实用技巧。

weixin_42543046的博客 393

Webug4.0 打靶笔记

一、Webug 的安装 (1)基本信息 WeBug 名称定义为”我们的漏洞”靶场环境 ,基础环境是基于 PHP/mysql 制作搭建而成,中级环境与高级环境分别都是由互联网漏洞事件而收集的漏洞存在的操作环境。部分漏洞是基于Windows操作系统的漏洞所以将WeBug的web环境都装在了一个纯净版的Windows 2003的虚拟机中。在 webug3.0 发布后的四百多天 226安全团队终于在大年初二发布了 webug 的 4.0 版本。 (2)虚拟机的安装 最新超详细VMware虚拟机下载与安装_隐

m0_60716947的博客 6130

约瑟夫环问题的数学解法

问题描述: 已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 当m和n不太大时,可以构造循环链表模拟,实现简单,容易理解,但是时间复杂度较高。这里主要研究一下数学解法(比较绕,我花了很久才想明白)。 以下是转载自别人博客,对我有帮助的一篇讲解: 原文 https://www.cnblogs.com/cmmdc/p/7216726.html 为了简化出列的过程

mschessy的博客 1139

FPGA串口通信----uart(一)

通过PLL锁相环IP的使用,可以输入时钟进行分频,倍频,也可以产生多路时钟输出信号。外部提供晶振的原因:①Fpga电路大多数需要时序分析②晶振在Fpga内部占空间大,所以放置于外部PCB板上Uart异步传输速率不能很快的原因:考虑到工程实际问题,假如时钟周期大(传输速率慢的话),采取到数据电平变化的边沿时刻的概率会小很多,这样数据也很准确,通常uart适用于2M.

mvpkuku的博客 971

约瑟夫环问题

描述 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 输入 8 1 3 (n=8 k=1 m=3 ) 输出 7 (剩下的那个) 样例输入 8 1 3 样例输出 7 #include <iostream> using namespace std; struct Node { in

_C9的博客 529

基于Python大数据的智能交通分析系统

该系统能够实时监测交通状况,分析交通流量,预测交通趋势,为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验。它能够为交通管理部门提供决策支持,帮助缓解交通拥堵,提高交通运行效率,减少交通事故发生率,改善市民出行体验,促进交通产业的健康发展。数据采集层:通过传感器、GPS设备、交通摄像头等数据源,实时采集交通数据,如车辆速度、位置、道路拥堵情况等。数据分析层:运用统计学方法、机器学习算法等,对处理后的数据进行深入分析,挖掘交通规律,预测交通趋势。

qq3828614760的博客 2969

华大HC32F460 TCP Client 实验

华大HC32F460 TCP Client 实验

ZhuoWuKeJi的博客 649

Java解决约瑟夫环问题

文章目录1 约瑟夫环2 复杂的约瑟夫环 1 约瑟夫环 约瑟夫环问题起源于一个犹太故事。约瑟夫环问题的大意如下:   罗马人攻占了乔塔帕特,41个人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家Joseph(约瑟夫)和他的一个朋友。剩余的39个人为了表示不向罗马人臣服,决定集体自杀。大家决定了一个自杀方案,所有这41个人围成一个圆圈,由第1个人开始顺时针报数,每报数为3的人就立刻自杀,然由...

记录学习点滴 1513

STC8单片机低功耗延时优化实践:从循环等待到定时唤醒

本文深入探讨了STC8单片机低功耗延时优化的核心方法,即利用掉电唤醒定时器(WKT)替代传统的循环等待,实现从“空转耗电”到“定时唤醒”的转变。通过实战代码演示了如何编写低功耗延时函数,将待机电流从mA级降至μA级,并分析了精度、唤醒时间等关键权衡点,为电池供电的物联网设备提供了有效的续航优化方案。

pea55的博客 326

用队列解决约瑟夫环问题

什么是约瑟夫环问题约瑟夫问题,有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.据说著名犹太历史学家 Jo...

czhf0002的博客 3762

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

如何用链表解决约瑟夫环问题

本文探讨了使用链表解决约瑟夫环问题的方法。约瑟夫环问题是一个经典的循环推理问题,涉及n个人围成一圈,按特定规则报数并出列。链表作为一种数据结构,能够有效模拟这一过程。文章详细介绍了创建环形链表、遍历链表、解决报数问题及处理剩余节点的基本思路,并提出了单链表实现法、栈实现法及使用第三方数据结构库等实现方法。此外,文章还分析了链表解决该问题的优缺点,如效率高、易实现,但也需考虑数据顺序性和一致性。最后,文章强调了根据具体需求选择合适实现方法的重要性,并指出了优化应用的方向。

2501_90410679的博客 88

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...

链表解决约瑟夫环问题

现在用链表解决约瑟夫环问题,链表与数组的区别在于,链表的出列是删除结点,而数组并没有真正删除元素,只是标记为不存在。 上代码: #include #include #define MAX 10 typedef struct node V_NODE; struct node{ int id; struct node *next; }; V_NODE *create_link(int

Jacob 1250

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

约瑟夫环问题 例题解决

摘要 主要是之前一直不知道约瑟夫环的dp解法,这里和大家分享一下。本文用三种方法给大家呈现本题。 最后一条毛毛虫 题目描述 小D的花园里养了 n 条毛毛虫,每条毛毛虫都有自己独有的编号(从 1 到 n )。 一开始,所有的毛毛虫都开开心心地生活在花园里,享受着食物和阳光。 直到某一天,额……它们知道自己肯定会被吃掉,所以就开始玩一个游戏,来决定被吃的顺序。游戏的方法是这样的: 所有毛毛虫按照编号顺序从 11 到 n 顺时针围成一个环,然后从 1 号毛毛虫开始顺时针依次报数,报到数字 m 的毛毛虫就出环被吃,

qq_43780964的博客 1万+

4种方法解决约瑟夫环问题

本篇文章我们总结了关于约瑟夫环问题的几种解法,它们各有优势,读者可以根据实际需要自行选择。好的问题可以引发学习者的思考,寻找更优解可以让攀登者更上一层楼。希望本篇文章能对你有所帮助,我们共勉。

m0_73355263的博客 1万+

java数组解决约瑟夫环问题

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

做梦的稻草人的博客 2745

python解决约瑟夫环问题(容易理解版)

python解决约瑟夫环问题(容易理解版) 约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人被杀掉;他的下一个人又从1开始报数,数到k的那个人又被杀掉;依此规律重复下去,直到圆桌周围的人只剩最后一个。 第一次写博客,请大家多多指教。 超级容易理解版: 思路:刚开始把所有的人放到一个列表里面去,报的数字不是3就把这个人放到列表的最后一...

自由小兵儿 4万+

利用JavaScript解决约瑟夫环的问题

问题背景:我们先来了解一下什么是约瑟夫环问题: 讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。于是约瑟夫建议:每次由其他两人一起kill一个人,而被kill的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在kill了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投降了罗马。let out=0//被kill的人数。let index=0//所循环的次数。

m0_73708717的博客 579

c++解决约瑟夫环问题

c++解决约瑟夫环问题 问题背景 约瑟夫(Josephus)问题: m个人围坐成一圈,从1开始顺序编号 游戏开始,从第一个人开始由1到n循环报数 报到m的人退出圈外 问: 最后留下的那个人原来的序号 问题分析 本题可以定义一个容器(vector),初始化大小(元素个数)为n。容器里元素的值标识该人是否出局,1在圈内,0出局。值为0的人不再参与报数,可以用一个整数型k...

Yinan_Zheng的博客 1万+

约瑟夫环问题解决

问题描述:编号为1-N的N个士兵围坐在一起形成一个圈,从编号为1的士兵依次开始报数(1,2,3..依次报),数到m的士兵会被杀死出列,之后的士兵再从1开始报数。直到最后剩下一士兵。求这个士兵的编号。 方法一:数组 第一次做这个题的时候,第一反应就是用数组来做。创建一个boolean数组,用true表示没出列,false表示出列,定义一个计数器,遍历数组,当加到与m相等时,就将true变为fal...

be_gin_ner的博客 394

Java算法解决约瑟夫环问题

Java算法解决约瑟夫环问题

weixin_62656417的博客 714

C语言解决约瑟夫环问题

C语言解决约瑟夫环问题

qq_41829337的博客 7673

C++解决猴王问题(约瑟夫环问题)

讲一个比较有意思的故事:约瑟夫是犹太军队的一个将军,在反抗罗马的起义中,他所率领的军队被击溃,只剩下残余的部队40余人,他们都是宁死不屈的人,所以不愿投降做叛徒。一群人表决说要死,所以用一种策略来先后kill所有人。于是约瑟夫建议:每次由其他两人一起kill一个人,而被kill的人的先后顺序是由抽签决定的,约瑟夫有预谋地抽到了最后一签,在kill了除了他和剩余那个人之外的最后一人,他劝服了另外一个没死的人投降了罗马。

dshycorz的博客 688
上一篇: 再谈指针
下一篇: 链表接口的实现
love1code
博客等级 码龄12年 19粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值