百科知识网

利用C解决约瑟夫问题。

发布时间:2025-10-06 | 来源:互联网转载和整理

这里补充一下约瑟夫问题的描述:N个人围成一圈,从第一个开始报数,数到M的人出队,然后他的下一位继续从1开始报数,数到M的出队,如此循环直到剩下一个人,求最后剩下的那个人最初是队伍中的第几位。

解决这道题可以采用模拟报数的方法,建立一个大小为N的数组,数组的第N个元素表示第N个人是否还在队伍中,首先将每个元素都置为1,表示全员都在队伍中。如果第N个人出队,则将第N个元素置为0。

模拟报数可以使用一个累加计数器,用它表示这轮报数已有多少人报数,然后循环访问每个人,若其在队伍中,则将计数器+1,如果累加到M,则这个人出队。如此循环直到N-1个人出队,仅剩1人。

最后遍历一下那个数组,找到还在队伍中的人就可以。

代码如下:

#includeusingnamespacestd;intmain(){intm,n,i,s=0,rem;//s为计数器,rem为剩余人数int*a;cout>n>>m;rem=n;a=newint[n];for(i=0;i1){s+=a[i];if(s==m)//第i个人出队,重置累加计数器{s=0;rem--;a[i]=0;}i++;i%=n;}for(i=0;i<n;i++)if(a[i]){cout<<剩下的人为:<<i<<endl;break;}delete[]a;return0;}

约瑟夫问题

上一篇:储存器可分为哪两种

下一篇:溶解度怎么算

其他文章

  • 如何举报高考违规
  • 很污的言情小说大全(言情小说大全污的片段)
  • 莲蓬乳和空心手指(蓬莲乳和空无指)
  • 天娱传媒旗下有哪些艺人
  • 终极一家为什么不能看了
  • 绵阳中学2023高三复读班招生简章
  • 暴殄天物和暴殄天物的区别
  • 自招线什么意思
  • 手机白名单怎么设置
  • 美国国庆放假几天
  • 附近有那些家政公司
  • 《满江红》全文诗词
  • 俩俩仨仨是成语吗
  • 果宝特攻中的人物名字都有谁
  • 东莞哪里有小龙虾批发
  • 袁氏家谱排辈
  • 年立水素杯真的有用吗
  • 汽车保养app排名推荐
  • 桥架人工费多少钱一米
  • 晚霞的寓意和象征