约瑟夫环问题

来源:互联网 发布:单例模式 java enum 编辑:程序博客网 时间:2024/05/29 08:48

约瑟夫环问题

题目描述:设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。

我的代码:

#include <iostream>using namespace std;void test_function(int n, int m){    bool data[n];    for(int i=0; i<n; i++){        data[i] = false;    }    int global_counter=1, k=0, k_counter,n_counter=0;    int i=0;    while(true){        i=k;        k_counter = 0;        while(true){            if(!data[i]){                k=i;                break;            }else{                k=-1;                k_counter++;            }            i=(i+1)%n;            if(k_counter==n){                break;            }        }        if(k!=-1){            if(global_counter%m==0){                cout<<(k+1)<<" ";                data[k]=true;                n_counter++;            }        }        k=(k+1)%n;        if(n_counter==n)            break;        global_counter++;    }}int main(){    test_function(5,3);    return 0;}
当然,这个是数组,还可以用循环链表来实现,预计明天实现一下。


0 0