求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
约瑟夫问题
题目描述
n n n 个人围成一圈,从第一个人开始报数,数到 m m m 的人出列,再由下一个人重新从 1 1 1 开始报数,数到 m m m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n − 1 n-1 n−1 名小朋友,而该题是全部出圈。
输入格式
输入两个整数 n , m n,m n,m。
输出格式
输出一行 n n n 个整数,按顺序输出每个出圈人的编号。
样例 #1
样例输入 #1
10 3
样例输出 #1
3 6 9 2 7 1 8 5 10 4
提示
1 ≤ m , n ≤ 100 1 \le m, n \le 100 1≤m,n≤100
题目来源
题解
并没有人打出如此简单的代码吧……
其实,此题就是一个模拟题。按照题意去做,用visit记录下已经出队了的人,然后模拟,一个个的加就行了。
还要注意,一开始,加的数要赋值为0。还有visit数组要开始全部赋值为false(早就知道了?我第一遍就忘了……)
代码如下:
#include<cstdio>
using namespace std;
int main()
{
int n,m,s=0;scanf("%d%d",&n,&m);//入读
bool visit[200]={0};//visit赋初始值
for(int k=0;k<n;k++){//总共要出队n次
for(int i=0;i<m;i++){if(++s>n)s=1;if(visit[s])i--;}//类似取模,而因为序列是从1开始的,所以不取模,加判断;若visit过,则i--,使其继续循环
printf("%d ",s);visit[s]=true;//输出,记录已出队
}
return 0;
}
求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
求点赞,求关注,求评论
526

被折叠的 条评论
为什么被折叠?



