题意:对n个人员进行1 2 3 1 2 3...的编号,报数3的人退出,将退出的人设为-1。问最后剩余一个人的编号是什么?

题意解析:假设n=10,每次都是123编号 
人:   1  2  3  4  5  6  7  8  9 10
编号:1  2  3  1  2  3  1  2  3 1  
           1  2 -1  1  2 -1  1  2 -1 1 //报数3的人设为-1
           2 -1 -1  1  2 -1 -1  1 -1 2  //这块儿最后一个直接接到第一个前面跟着编号
           -1 -1 -1 1  2 -1 -1 -1 -1 1
          -1 -1 -1 2 -1 -1 -1 -1 -1 1
          -1 -1 -1 2 -1 -1 -1 -1 -1 -1

不是-1的结果就是最后一个剩余的人->4

代码解析:

(1)对n个人员进行1 2 3 1 2 3...的编号:

这个并不需要真正的对每个人去赋值编号,而且编号是动态变化的,也无法做到赋值,因此可以引入一个变量count在循环内循环编号123,只需要将编号不为-1的值位置count++,当count=3时重新置为1。

(2)报数3的人退出,将退出的人设为-1:

用count来寻找报数为3的人,并将其赋值为-1

(3)需要将最后一个人与第一个人连接到一起排序,形成一个环:

如果用i来控制循环,数组长度为len1,则: i = i % len;

(4)如何判断还剩一个人:

定义变量left,初始化为人数量,每赋值一个-1,left--;当left=1极为最后一人。

完整代码:

int YSFH(int* arr,int len,int n)
{assert(arr != NULL&&n>0);int count = 0;int left = len;int i = 0;while (left > 1)//for (int i = 0; i < len;)//函数循环{if (arr[i] != -1) {count++;}if (count == n) {arr[i] = -1;//count=-1left--;count = 0;//从头开始编号}i++;//不能将i++写在i = i % len;后面!!i = i % len;//函数终止条件 剩余人数为1/*if (left == 1)break;*/}  for (int i = 0; i < len; i++){if (arr[i] != -1){return arr[i];}  }
}
int main()
{int len=10;//人数//scanf("%d", &len);int* arr = (int*)malloc(sizeof(int) * len);for (int i = 0; i < len; i++)*(arr + i) = i + 1;assert(arr != NULL);if (arr == NULL)printf("内存申请失败");printf("%d",YSFH(arr,len,3)) ;free(arr);arr = NULL; //将arr置空能避免对内存的重复freereturn 0;
}

运行结果:

C语言实现约瑟夫环代码相关推荐

  1. c语言约瑟夫环分函数,c语言实现约瑟夫环问题

    <c语言实现约瑟夫环问题>由会员分享,可在线阅读,更多相关<c语言实现约瑟夫环问题(16页珍藏版)>请在人人文库网上搜索. 1.一)基本问题1问题描述设有编号为1,2,小的n ...

  2. 约瑟夫环双向链表c语言实,双向链表与约瑟夫环代码

    双向链表 //注意:该文件操作的链表为带头结点双向链表,头结点数据为-1 #include #include #include #define OK 1 #define ERROR 0 typedef ...

  3. 约瑟夫环代码展示,以及理解约瑟夫环

    本人也是刚刚接触算法,如果有不准确的地方,欢迎大家留言评论,一起学习,一起进步,奥利给! 约瑟夫环的简单的图例(画的太抽象,大家理解下,我有必要去学学画画了!) 约瑟夫环的原理 1.一群人围在一起坐成 ...

  4. 约瑟夫环数据结构c语言程序,约瑟夫环问题详解(C语言链表实现)

    约瑟夫环问题,是一个经典的循环 出列顺序依次为: 编号为 3 的人开始数 1,然后 4 数 2,所以 4 先出列: 4 出列后,从 5 开始数 1,1 数 2,所以 1 出列: 1 出列后,从 2 开 ...

  5. C语言约瑟夫报数出圈算法,c语言实现约瑟夫环问题

    (一)基本问题 1.问题描述 设有编号为1,2,-,n的n(n>0)个人围成一个圈,每个人持有一个密码m.从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m ...

  6. C语言解决约瑟夫环问题 详细注释

    约瑟夫环算法是: n 个人围成一圈,每个人都有一个互不相同的密码,该密码是一个整数值,选择一个人作为起点,然后顺时针从 1 到 k(k为起点人手中的密码值)数数.数到 k 的人退出圈子,然后从下一个人 ...

  7. C语言:约瑟夫环(简单版)

    传说约瑟夫当年活下来就是靠快速计算这个问题. nn 个人围成一圈,编号依次为1,2,3-n.从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈.以此类 ...

  8. 约瑟夫环c语言程序完整版,C语言:约瑟夫环问题(源代码)

    本帖最后由 geige 于 2015-7-26 00:48 编辑 #include #include struct stu //构建一个新的数据类型 { int num; struct stu *ne ...

  9. 用C语言编写约瑟夫环程序,约瑟夫环C语言,请高手检查我的程序

    /*TC2编译通过*//*测试了几组数据,没有发现问题*//*如果有问题,再M我*/#include typedef struct Cnode {int data; int password; str ...

  10. Java_Josephus problem 约瑟夫环详尽分享

    Java_Josephus problem 约瑟夫环详尽分享 先看代码后看分享 文章目录 Java_Josephus problem 约瑟夫环详尽分享 1. 约瑟夫环代码 2. 什么是约瑟夫环 3. ...

最新文章

  1. linux shell 的 for 循环
  2. 散射理论方程_非弹性中子磁散射方法简介之自旋波激发
  3. java 等待几秒_问懵逼:请站在 JVM 角度谈谈 Java 的锁?
  4. 《2021新青年生长力报告》:水果青年、农货青年、设计青年,哪个最潮?
  5. 怎样选择宽带上网产品--解读上海电信政企宽带新套餐
  6. 使用.Net Core MVC创建Web API
  7. distinct 多列详解
  8. 每日一句20200104
  9. r语言上机文本分析与词云绘制_R语言jiebaR包文本中文分词及词云上机练习,小白能做到...
  10. html在线预览wordexcel文档,直接在线预览Word、Excel、TXT文件之ASP.NET
  11. 用大O记号法测量算法的效率(Algorithm efficiency Asymptotic notation Big O notation)
  12. 蓝牙BT射频测试(转发)
  13. 云计算业务发展迅速 或成资本角逐新战场
  14. ionic ion-refresher刷新完毕
  15. NOIP2017 逛公园 (拓扑,dp,最短路)
  16. 周跳探测——历元间差分法
  17. 谷歌浏览器翻译插件方便阅读方法,收藏备用
  18. 项目环境搭建,数据库,以及Swagger2介绍(二)
  19. HTML标签与CSS样式
  20. Arduino中矩阵键盘的编程与搭建

热门文章

  1. bt porting
  2. html5播放倍速,[html5]html5倍速播放功能源代码实例
  3. 服务器主板能插几块硬盘,如何知道自己的主板最大支持多少的硬盘啊
  4. 计算机 怎么挂 两块 硬盘,双硬盘怎么安装?电脑双硬盘安装教程
  5. Windows命令行netsh winsock reset解决网络连接问题
  6. 老罗Android开发视频教程 打包下载地址,收集起来,给大家下载
  7. tcpip详解卷一_2020高考物理北京卷逐题视频解析+Word版真题
  8. 计算机网络 Kurose 第二章 应用层 2.5 P2P文件分发 2.6 视频流和内容分发网
  9. 高仿斗鱼 android,Android 高仿斗鱼滑动验证码
  10. 通过Python对商品销售数据预测