约瑟夫环数组java实现_约瑟夫环的数组解法

d51505e635e931179c821ab5e144e76c.png

问题描述:n个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,直到最后剩下的人胜出。算法书上基本是用链表来解决问题,当初学者对链表都还不是很清楚的时候,可以利用已学的数组知识来解决。代码如下:

#include

using namespace std;

int main()

{

//输入n个人、报数m

int n, m;

cin>>n>>m;

//将n个人编号存入数组

int a[n];

for(int i = 0; i < n; i++)

a[i] = i+1;

//loser为出圈的人数,count为数到m的计数器

int loser = 0;

int count = 0;

//当出圈人数小于n-1的时候,一直循环下去

while(loser < n - 1)

{

for(int i = 0; i < n; i++ )

{

//数到m的人后,该数组元素置0,该人出圈,下一轮重新数的时候跳过,数组元素不为0说明该人仍在圈内

if (a[i]!=0)

{

count++;

if(count == m)

{

loser++;

a[i] = 0;

count = 0;

}

//当出圈的人为n-1,游戏结束,跳出循环,剩下的人胜出

if(loser == n - 1)

break;

}

}

}

//打印出最终胜出的人的编号

for(int i = 0; i < n; i++)

{

if(a[i]!=0)

cout<

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值