1.前言

最近有点emo,写博客也没有什么特别想写的内容 这篇博客把约瑟夫环用C语言来写一下 巩固一下原来学过的知识。

2.什么是约瑟夫环

这有个历史故事还是比较有意思的:据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。

简而言之,这个问题概括就是:有41个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?

3.算数分析问题

(以12个人举例进行画图分析)

正如同这张图所表示的:
第一次淘汰:从第一个人开始报数的时候3的倍数全部死亡
第二次淘汰:从上次死亡的后一位开始来进行从1开始的报数

…(循环上述的步骤)

直到最后判断是否剩下一个人,如果剩下一个人则结束。

经过四次循环 游戏结束 最终只剩下一位幸存者为第10位。

四.编程思想分析

(1)由于对于每个人只有死和活两种状态,我们可以对每个人的生命值进行赋值 存活为1,死亡为0。
(2)开始时每个人都是活的,所以数组初值全部赋为1
(3)循环前先判断剩余的幸存者是否大于1个
(4)如果出现淘汰的人下一个人从1开始重新开始计数

五.编程实现

函数原型:

int Josephus_problem(int n)//这里面的n为参与的总人数。

考虑到游戏人数由n传入,存储大小未定因此我们需要用到动态内存的知识,来定义一个动态数组给他们依次编号。

int* arr = (int*)malloc(n * sizeof(int));

因为在最初开始所有的人都是存活的所以就将数组初值赋为1代表存活。

for (int i = 0; i < n; i++){arr[i] = 1;}

随着报数的不断进行,总人数肯定会不断减少,并且我们需要通过判断幸存人数来判断是否结束循环 所以我们引入一个变量tmp来代表剩余人数。

int tmp = n;//幸存人数

而且有一个关键性的变量,那就是各个玩家所报出来的数字,我们用这个数字来淘汰每个报数报到3的玩家,在这里我们将他命名为count。

int count = 0;//报的号

我们需要一个循环来进行报数操作,但是在循环前我们需要判断剩余人数是否为1,如果大于1才可以正常执行下列循环操作

while (tmp > 1){}

判断完剩余人数后,进行循环,通过循环来进行报数操作并且完成每位成员依次报数与报到3就将他的生命值赋为0:

 for (int i = 0; i <n; i++){if (arr[i] == 1){count++;if (count == 3){arr[i] = 0;tmp--;count = 0;}}}

最后加个判断 如果传入的人数为负值或者出现其他错误,直接返回-1相当于报错 我们也可以知道中途出现了错误。

for (int i = 0; i <n; i++){if (arr[i] == 1){return i;}}return -1;

六.完整代码及运行结果

#include<stdio.h>
#include<stdlib.h>int Josephus_problem(int n)
{int* arr = (int*)malloc(n * sizeof(int));for (int i = 0; i < n; i++){arr[i] = 1;}int tmp = n;//幸存人数int count = 0;//报的号while (tmp > 1){for (int i = 0; i <n; i++){if (arr[i] == 1){count++;if (count == 3){arr[i] = 0;tmp--;count = 0;}}}}for (int i = 0; i <n; i++){if (arr[i] == 1){return i;}}return -1;
}int main()
{printf("%d\n", Josephus_problem(人数)+1);return 0;
}

运行结果:
以12人为例

与上面画图分析结果相同。

以41人为例

七.小结

对于约瑟夫环这个问题,最重要的就是将数学思维转换为C语言思维,最终运用代码表示出来;并且在编写代码的过程中还需要注意一些小的细节:需要用动态内存分配存储空间,还有学会运用变量这样可以使问题变得更加简便。

(如有问题,欢迎大佬指正)

C语言 (编程题:约瑟夫环 报数游戏)相关推荐

  1. c语言小学生加法考试题程序4,c语言编程题及答案.doc

    c语言编程题及答案.doc C C 语言编程题及答案(三)语言编程题及答案(三) 1. 给小学生出加法考试题 编写一个程序,给学生出一道加法运算题,然后判断学生输入的答案对错与否,按下列 要求以循序渐 ...

  2. 灯泡四个闪烁c语言程序设计教程课后答案,c语言编程题及答案4.doc

    C C 语言编程题及答案 三 语言编程题及答案 三 1 给小学生出加法考试题 编写一个程序 给学生出一道加法运算题 然后判断学生输入的答案对错与否 按下列 要求以循序渐进的方式编程 程程序序 1 通过 ...

  3. c语言小学生加法考试题程序4,c语言编程题与答案4.doc

    c语言编程题与答案4 c语言编程题及答案(三) 1. 给小学生出加法考试题 编写一个程序,给学生出一道加法运算题,然后判断学生输入的答案对错与否,按下列要求以循序渐进的方式编程. 程序1 通过输入两个 ...

  4. c语言编程题考试自动评分系统,C语言编程题考试自动评分系统简介.ppt

    C语言编程题考试自动评分系统简介 主要内容 教材简介 学习方法 机考系统简介 教材简介 教学理念的更新 教材简介 教材简介 国内55所院校使用 新版增加的内容 强化知识点.算法.编程方法与技巧 [编程 ...

  5. 【华为OD机试真题 JAVA】报数游戏

    JS版:[华为OD机试真题 JS]报数游戏 标题:报数游戏 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 100个人围成一圈,每个人有一个编码,编号从1开始到100.他们从1开 ...

  6. c++ 求四边形面积和周长_C语言编程题 题目:任意输入4个点,求围成四边形的面积是多少?...

    C语言编程题:任意输入4个点,求围成四边形的面积是多少.代码如下: #include "stdio.h" #include "math.h" void main ...

  7. c语言程序题是如何判分的,C语言编程题判分系统的研究与实现

    摘要: 随着计算机技术和因特网的发展,B/S模式的教学系统在高校教学中显得越来越重要.C语言程序设计是计算机专业的一门重要的基础课程,具有实践性强的特点,在教学中应加大实践教学比例.本文利用网络技术开 ...

  8. 输入两个数、用python求他们的和_从键盘上输入俩个实型数,编程求它们的和差积商,要求输出时,保留两位小数C语言编程题:从键盘上输入两个...

    从键盘上输入俩个实型数,编程求它们的和差积商,要求输出时,保留两位小数 C语言编程题:从键盘上输入两个 www.zhiqu.org     时间: 2020-11-23 参考代码: #includev ...

  9. c语言代码题及答案,c语言编程题精选及答案

    c语言编程题精选及答案 C 语言编程题精选 C 语言学习 2010-11-30 15:48:25 阅读 47 评论 0 字号:大中小 订阅 1. 有函数 F(x)=(x+1)2 和 G(x)=2x+1 ...

最新文章

  1. python 保存内容到记事本里面
  2. python打开文件_python如何学习
  3. Codeforces Round #309 (Div. 2) A. Kyoya and Photobooks 字符串水题
  4. ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍
  5. 说干就干的p2psearcher2013
  6. 好玩的网页小游戏源码《星球防御战射击》
  7. 转载:Prototype.js的中文使用手册
  8. 【恋上数据结构】基数排序、桶排序、休眠排序
  9. python模块介绍二。
  10. 关于新建android项目时 appcompat_v7报错问题的一点总结
  11. 51 单片机AD采集电压值的坑
  12. c++用键盘按键控制光标移动_如何在Windows10中用键盘控制鼠标光标
  13. 用javascript写一个简单的登录表单,包含用户名、密码和手机号码。提交数据时验证用户名、密码和手机号输入格式。
  14. MySQL将多条数据合并成一条
  15. PHP PEAR网站遭黑客入侵,官方软件安装包被篡改
  16. Mysql 设计超市经营管理系统,包括商品信息表(goods) 和 商品类型表(goodstype)
  17. 如何监测内存泄漏(引用自网络)
  18. 光脚丫思考Vue3与实战:第04章 模板语法 第02节 指令的参数+动态参数
  19. 第十九期基金定投-价值股又有起飞的迹象了
  20. 计算机求职英语作文,计算机求职信英语作文

热门文章

  1. (转)Python网络爬虫实战:世纪佳缘爬取近6万条数据
  2. PaddleX 模型库官方介绍
  3. HFOI2017.07.09校内赛(普及组)题解
  4. linux ping -w 命令,ping命令--Linux命令应用大词典729个命令解读
  5. android物联网开发简书,Arduino物联网开发实例教程
  6. CSS-鼠标划过时的样式
  7. MATLAB实现基于BP神经网络的图像压缩
  8. 解决谷歌翻译网域限制问题
  9. 企业机房冷通道监控解决方案
  10. 无人机导航系统——传感器