一、问题描述
Josephus及他的朋友共41人围成一个圆圈,由第1个人开始报数,
每数到3该人就必须出去,然后再由下一个人重新报数,直到圆圈上少于3人为止。
Josephus 将朋友与自己安排在第16个与第31个位置,成为最后剩下的人。
扩展这个问题,当人数为n,每次报数为step时,求解最后的step-1个剩下的人的位置
二、C++用数组模拟Josephus问题
流程图
C++实现代码
#include<iostream>
#include<iomanip>
using namespace std;
/*
Josephus及他的朋友共41人围成一个圆圈,由第1个人开始报数,
每数到3该人就必须出去,然后再由下一个人重新报数,直到圆圈上少于3人为止。
Josephus 将朋友与自己安排在第16个与第31个位置,成为最后剩下的人。
扩展这个问题,当人数为n,每次报数为step时,求解最后的step-1个剩下的人的位置
*/
int main() {
int n, step;
int count=0; // the number out of the circle
int index=0;
int k=0;
cout << "Input n and step:" << endl;
cin >> n >> step;
int a[n] = {0}; // init array element
while(count < n-(step-1)) { //
if(index>n-1) index=0;
if(a[index]==0) k++; // in circle, number off
if(k==step) {
a[index]=1; // fall out
k=0;
count++;
}
index++;
}
for(int i=0; i<n; i++) {
if(a[i]==0)
cout << setw(4) << i+1;
}
cout << endl;
return 0;
}
三、Python用列表模拟Josephus问题
利用Python列表的切片操作,可以非常巧妙地模拟实现Josephus环问题。究竟巧在何处?下面直接上
Python实现代码
# 约瑟夫环问题
# 输入n和k,输出最后剩下的编号
n, k = map(int, input().split())
if k<2 or n<k:
print("Data Error!")
else:
circle = list(range(1, n+1)) # n个人的编号列表
while len(circle) > k:
circle = circle[k:] + circle[:k-1]
print(circle[:k-1])