@[TOC]
第一种方法 数组
// 更新 2019.10.28 ... 先贴上时隔半年更新后的代码,
// 完全独立的新思路, debug二十多分钟搓出来的, 虽然看起来比原来的长, 时间复杂度也有上升 ... 但毕竟是完全属于自己的想法, 并独立实现的, 这点算是最可贵的, 先贴这个自己的思路
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+100;
void JosefuProble ( int n, int m ) {
int arr[MAXN];
memset( arr, -1, sizeof(arr) ); arr[0] = -1; // 初始化为 -1 是为了方便用 0 表示出队的人
for ( int i = 1; i <= n; ++i ) arr[i] = i;
int index = 0,
cnt = 0;
while ( 1 ) {
if ( !arr[++index] ) continue; // 下标移动, 同时跳过出队的人
if ( index==n+1 ) { // 处理越界情况
bool isOver = false; // 下标越界重新找一个未出列的人, 同时判断是否是所有人全部出列
for ( int i = 1; i <= n; ++i ) {
if ( arr[i] ) {
index = i;
break;
}
if ( i==n ) isOver = true;
}
if ( isOver ) break;
}
if ( ++cnt==m ) { // 找到了需要出队的人的位置
cnt = 0; // 初始化计数器
cout << arr[index] << " "; // 输出
arr[index] = 0; // 此人出队
bool isOver = true; // 判断是否是所有人全部出列来确定是否终止
for ( int i = 1; i <= n; ++i )
if ( arr[i] ) {
isOver = false;
br