循环链表1(猴王问题)

问题描述

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

输入数据

每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m, n < 300)。最后一行是:0 0

输出要求

对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号

输入样例:

6 2

12 4

8 3

0 0

输出样例:

5

1

7

#include"iostream"
using namespace std;
int getKing(int n,int m);
int main(){
    int n;
    int m;
    while(true){
        cin>>n>>m;
        if(n==0&&m==0){
            break;
        }
        cout<<getKing(n,m)<<endl;
    }
    return 0;
}
/*
600000 2
12 4
8 3
0 0

*/
int getKing(int n,int m){
    int *arr = new int[n];
    for(int i = 0;i < n;i++){
        arr[i] = 1;
    }
    int j = 0;
    for(i = 0;i < n - 1;i++){
        int k = 0;
        for(j = j%n;;j++){
            if(arr[j%n]){
                if(++k==m){
                    break;
                }
            }
        }
        arr[j%n] = 0;
    }
    for(i = 0;i < n;i++){
        if(arr[i]){
            return i + 1;
        }
    }
    delete[] arr;
    return 0;
}
原文地址:https://www.cnblogs.com/oleolema/p/9033073.html