摘自百度百科

N 个人围成一圈,从第一个人开始报数,数到 M 的人出圈;再由下一个人开始报数,数到 M 的人出圈。

约瑟夫问题的两种形式:

1.求出最后剩下的人的原始序号:

#include<stdio.h>
int main()
{int m,n,k,b,f;scanf("%d%d",&m,&n);b = n-1;//n-1使得序号从0开始 for(k=1;k<=m;k++){f = b%k;b = f+n;}printf("%d ",f+1);//f+1使得序号从1开始 return 0;
}

2.依次打印每次出列的人的原始序号:

#include<stdio.h>
int main()
{int m,n,i,k,b,f;scanf("%d%d",&m,&n);for(i=0;i<m;i++){b = n-1;//n-1使得序号从0开始 for(k=m-i;k<=m;k++){f = b%k;b = f+n;}printf("%d ",f+1);//f+1使得序号从1开始 }
}

一开始接触这类题目,我们较直接的思路是用链表或者数组来模拟整个游戏过程,但这有一个缺点是,程序繁琐。为此我们在数学上推敲一下,寻找一些规律。

因为(编号0~(n-1))报数报到(M-1)的人退出,剩下的人继续从0开始报数,意思就是把原来的序号减去M。比如N=7,M=4 的时候:

第一轮报数第4个人(编号为3)退出,剩下的人的序号都减4变成从0开始:

旧序号:0 1 2 3 4 5 6      (7人)

新序号:3 4 5 x 0 1 2      (6人)

可以发现,旧序号=(新序号+4)%7

注:(因为新=旧-4,所以旧=新+4,又因为他们排成一个圆(0-6-0),且最大的序号只能是6,为防止+4之后序号可能>6,所以要对7取余,比如当+4=7、8、9,取余之后就是0、1、2,这里取余的方法感觉挺巧妙的)

第2轮报数第4个人(编号还是3)退出后,序号变化如下:

旧序号:3 4 5 x 0 1 2       (6人)

新序号:x 0 1 x 2 3 4        (5人)

可以发现,旧序号=(新序号+4)%6

第3轮报数第4个人(编号还是3)退出后,序号变化如下:

旧序号:x 0 1 x 2 3 4        (5人)

新序号:x 1 2 x 3 x 0        (4人)

可以发现,旧序号=(新序号+4)%5

……

第6轮报数第4个人(编号为1)退出后,序号变化如下:

旧序号:x 0 1 x x x x       (2人)

新序号:x 0 x x x x x        (1人)

可以发现,旧序号=(新序号+4)%2

所以最后一个人的序号一定是0,因为只剩他一个人了,他在前1轮的序号是(0+4)%2=0,在前2轮的序号是((0+4)%2+4)%3=1……所以递推回来,他最原始的序号就是((((((0+4)%2+4)%3+4)%4+4)%5+4)%6+4)%7=1,所以第一题用一个for循环就可以求解了。

第2题跟第1题思路差不多。首先我们知道这个游戏是每一轮报数出列一人,倒数第二个出列的人是在倒数第二轮出列,倒数第三个出列的人是在倒数第三轮出列……只要我们知道这些人在他们所出列的轮数时的序号,我们就可以按照第1题的方法逆推回去,得到他最原始的序号。(假设N=7,M=4)因为每次都是报数为3的人出列,所以他们出列时的序号一般都是3,有个问题是,当人数减到<M时,序号就不是3了,我们仍然可以通过取余解决,即3%N'(N'为当剩余人数),比如倒数第2个出列的人的原始序号可以由以下表达式求得:

(((((3%2+4)%3+4)%4+4)%5+4)%6+4)%7=2

倒数第3个出列的人的原始序号可以由以下表达式求得:

((((3%3+4)%4+4)%5+4)%6+4)%7=6

……

所以第二题用两个for循环就可以求解,并且没有用到数组。如果要求编号从1开始,只需要把最终结果加上1即可。可以用下面的输入验证一下。

Sample

Input


8 5

Output


5 2 8 7 1 4 6 3

约瑟夫问题(c语言)相关推荐

  1. python约瑟夫环_Python语言之如何实现约瑟夫环问题

    本文Python语言实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,希望对大家学习Python语言有所帮助,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0 ...

  2. 约瑟夫环--C语言解析

    约瑟夫环问题 约瑟夫环:在我们C语言的初学基础中,会遇到魔方阵,做游戏踢出 队列.都要用到循环数组.魔方阵之前有讲解,今天只说做游戏踢出队列. 这类问题有很多说法.现在我们说做游戏退出:有n个人,在一 ...

  3. 约瑟夫问题C语言加注释,用链表实现约瑟夫环【有注释,有很多注释】

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 主要问题在于删除约瑟夫环的数,结果一直出不来,看了好几天改了好几次都改不对 #include #include typedef struct ysf { ...

  4. 约瑟夫问题C语言实现——N个人排成一队循环报数,报M的倍数的出列,最后剩下的的是原来队列的第几位

    题目1,假设有30个人,没人轮流循环报数,当报到9的倍数的人出列,剩下的继续,问最后剩下的1个人是原来的第几号? 代码如下 /** @Date 2019-09-04* @Author krisfan* ...

  5. 约瑟夫问题——C语言实现

    约瑟夫问题 约瑟夫问题简述 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始 ...

  6. 用单循环链表实现约瑟夫环(c语言)

    首先我是设置的链表节点的元素包括三个:1.每个人的各自拥有的顺序(math表示)2.每个人所拥有的密码(data表示)3.指针元素指向下一个: typedef struct node {int mat ...

  7. 数据结构解决约瑟夫问题C语言

    据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式:4 ...

  8. c语言 队列 游戏,循环队列实现约瑟夫游戏(C语言版)

    #include #include typedef struct node { int *base; int front; int rear; }Node; /* 思路: *使用一个顺序循环队列来存放 ...

  9. c语言约瑟夫环问题,C++_详解约瑟夫环问题及其相关的C语言算法实现,约瑟夫环问题 N个人围成一圈 - phpStudy...

    详解约瑟夫环问题及其相关的C语言算法实现 约瑟夫环问题 N个人围成一圈顺序编号,从1号开始按1.2.3......顺序报数,报p者退出圈外,其余的人再从1.2.3开始报数,报p的人再退出圈外,以此类推 ...

最新文章

  1. 菜鸟必读 Linux系统的字型设定方法
  2. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
  3. 用3个IO口控制6个LED灯,怎么做到的?查理复用!
  4. 十五步骤手把手学会制作网吧XP母盘制作
  5. OJ1070: 小汽车的位置(C语言)
  6. leetcode1319. 连通网络的操作次数
  7. 线头尾两端各插入块lisp_工作叶片采用减振块防止叶片损坏,在低压涡轮轴上要有防飞转措施...
  8. 模拟grid点击事件
  9. html文本框上下左右移动,基于jQuery实现文本框缩放以及上下移动功能
  10. java.util.concurrent.locks.LockSupport
  11. SwitchyOmega规则列表地址
  12. Java小游戏 超级玛丽源码分享
  13. 经典混响插件免安装+50拓展 – Audio Ease Altiverb 7 XL 7.2.8 WiN
  14. WPS for Linux添加字体
  15. 企业微信最全17种获客+4种自动转化玩法
  16. sue的小球 牛客(区间dp)
  17. PGP在加密技术中的应用
  18. 分位数Granger因果检验实现原理
  19. 近期整活之相关软件之安装说明
  20. 深度学习数学基础——矩阵微分篇

热门文章

  1. word无法选定图片随文字移动
  2. mac kindle app打不开书/白屏解决方案
  3. kindle for PC更新后无法打开解决方案
  4. Windows科普:正版盗版系统有何不同?
  5. Excel - 如何在 Excel 表格的一个单元格内换行?
  6. Python写的现金管理程序
  7. 超百万人用它生成3D头像,这项技术刚刚中选了SIGGRAPH Asia 2022
  8. C#控件开发---控件属性编辑器
  9. 2019中国网络作家影响力榜乌贼排第一,烽火第二十,让人不解
  10. mac上使用nginx代理