约瑟夫循环(数组模拟环)

  
/*
    最普通的约瑟夫环的写法,用一个数组来模拟一个环,什么算法都没用,以前又看到过链表版本的,
    队列版本的。。。。但是,最神犇你的还要属于位运算版本的。。虽然那个现在还没有学会,以后
    会认真的学习的。
    
    关键的几个要点:do-while的循环终止条件,出队人数的统计,报数器,一个随时跟着所有人编号的变量
                    bool 类型的数组。

*/

# include<cstdio>
# include<iostream>

using namespace std;

# define MAX 100+10

bool a[MAX];//开一个布尔逻辑类型的数组,用来表示队伍中每个人的状态。false表示在队列中,true表示已经出队

int main(void)
{
    int n,m;cin>>n>>m;
    for ( int i = 1;i <= n;i++ )
        a[i] = false;//一开始将所有人都在这个队列中啊
    int t,f,s;
    t = f = s = 0;//do-while前的初始化
    do
    {
        t++;//从第一个人开始依次报数了~
        if ( t == n+1 )
            t = 1;//用数组来模拟一个环,经常使用的一个技巧
        if ( a[t]==false )
            s++;//如果这个位置还有人在的话,就报数加一
        if ( s==m )
        {//报啊报,终于报到我们要找的那个人了~
            s = 0;//报数器从此清0
            cout<<t<<endl;//输出这个人的编号
            a[t] = true;//这个人就从此滚出了队列
            f++;//出队人数加一
        }

    }while( f!=n );//牛逼的结束条件

    return 0;
}


注释做的很详细了,话说刚山口山结束,写到水题热热身~~~~注释写的很清楚了,看不懂的话手模下,很快就能出结果了,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值