约瑟夫问题

来源:互联网 发布:ubuntu root用户提权 编辑:程序博客网 时间:2024/06/05 06:02

 题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到m报数),凡报到m的人退出圈子,问最后最后留下的是原来第几号的那位.

提示:用数组完成

#include<iostream>
using namespace std;
int main()
{
    bool a[101]={0}; //注意务必初始化
    int n,m,f=0,t=0,s=0;
    cin>>n>>m;
    do
    {
        ++t;//逐个枚举圈中的所有位置
        if(t>n)
            t=1;//数组模拟环状,最后一个与第一个相连
        if(!a[t])
            s++;//第t个位置上有人则报数
        if(s==m)//当前报的数是m
        {
            s=0;//计数器清零
            cout<<t<<" ";//输出被杀人编号
            a[t]=1;//此处人已死,设置为空
            f++;//死亡人数+1
        }
    }while(f!=n);//直到所有人都被杀死为止
    return 0;
}

这个程序有几处智慧之处:
首先,它实现了数组的环化。
并且用数组进行标记,置一即失效。
最后有一个独立的计数器,可以进行清零,形成循环
0 0