约瑟夫问题 思路 n个人每次数m次,然后出队.
开一个数组存储 每个数字,然后用一个数组st标记该数字是否出队,若出队直接跳过。再开一个flag统计数字是否都走完了 ,走完跳出循环。
t 代表数到第几次了,如果到达m次出队。之后把t的值重置一下就好
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
bool st[101];
int main(){
int n,m;
int a[101];
cin >> n >> m;
int j = 0;
for(int i = 1; i <= n ; i++) a[i] = i; //第i个数字存储在a[i]中
int k = 0;
int i = 1;
int flag = 0;
while(1)
{ if(!st[i]) //该数字没有出队
{ ++k;
if(k == m) // 第m个出队
{ cout << a[i] << ' ';
st[i] = true; // 标记该点已经出去了
flag ++; // 总共出去了flag个
k = 0;
}
}
if(flag == n) break; //数字出去完了 ,退出循环
++i;
if(i > n) i = 1; //下标越界 i置1 从头开始找
}
return 0;
}