约瑟夫环问题
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;
}
如果您有更优的解法,欢迎在评论区一起交流噢~
阅读剩余
作者:小鱼
链接:https://www.52stu.com/?p=199
文章版权归作者所有,未经允许请勿转载。
链接:https://www.52stu.com/?p=199
文章版权归作者所有,未经允许请勿转载。
THE END