约瑟夫问题简述:N个人围成一圈,从第一个开始报数,第M个将被杀掉,求最后剩下的那一个人。
eg.
如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
1号位置的人活下来了。
话不多说,上代码。
时间复杂度为O(nm)
#include<iostream>
#include<stdio.h>
#define N 101
using namespace std;
int main(){
//freopen("in.txt","r",stdin);
int n,m;
bool a[N]={0};//0为人还在,1为人不在
int deathNum=0;//记录出局人数
int count=0;//用来数数
int i=0;//用来遍历
while(cin>>n>>m){
do{
++i;
if(i>n)
i=1;
if(a[i]==0)
count++;
if(count==m)
{
count=0;
a[i]=1;//此人已出局
deathNum++;
cout<<i<<' ';
}
}while(deathNum!=n);
}
//fclose(stdin);
return 0;
}