约瑟夫环问题

Description

N个人围成一圈,从第一个人开始报数数到M的人出圈;再由下一个人以1开始报数,数到M的人出圈...如此类推,输出依次出圈的人的编号。(m<=n=100)

Input

一行两个数,n和m,分别用空格隔开.

Output

一行n个数,表示出圈的人的编号,用空格隔开

Sample Input

10 3

Sample Output

3 6 9 2 7 1 8 5 10 4

python解法

# 输入总人数n和报数上限m
n, m = map(int, input("").split())
# 初始化一个列表,表示围成一圈的人,编号从1到n
people = list(range(1, n+1))
# 存储出圈顺序的列表
result = []
# 当前报数人的索引
index = 0
# 当people列表不为空时,即还有人没有出圈时,继续循环
while people:
    # 计算报数M次后的人的索引位置
    count = 0
    while count < m-1:
        # 索引+1表示下一个人,%len(people)确保索引不会越界
        index = (index + 1) % len(people)
        count += 1
    # 移除出圈的人,并将其添加到结果列表中
    result.append(people.pop(index))
# 将结果列表中的元素转换为字符串,并用空格连接后输出
print(' '.join(map(str, result)))

c++解法

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n,m,p=0,countM=0;
	int arr[105]= {0};
	int count=0;
	cin>>n>>m;
	while(count<n) {
		p++;
		if(p==n+1) { //首尾相接
			p=1;
		}
		if(arr[p]==0) {
			countM++;
		}
		if(countM==m) { 
			countM=0;//重新开始
			cout<<p<<" ";
			arr[p]=1;//更新数组
			count++;
		}
	}
	return 0;
}
如果您有更优的解法,欢迎在评论区一起交流噢~
阅读剩余
THE END