约瑟夫环(c++)
2019-08-28 本文已影响0人
w_dll
#include<iostream>
using namespace std;
void joseph(int sum,int m){
int people[sum],temp[sum],index;
for(int i=0;i<sum;i++){
people[i]=i+1;
}
while(1){
int remain_people=0;
for(int i=0;i<sum;i++){
if(people[i]!=0){
index=people[i];
temp[remain_people++]=people[i]-1;
}
}
cout<<"remain people:"<<remain_people<<endl;
if(remain_people==1){
cout<<index<<endl;
break;
}
if(remain_people>=m){
int out_people=temp[m-1];
cout<<"out people:"<<people[out_people]<<endl;
people[out_people]=0;
}
else if((m%remain_people)==0){
int out_people=temp[remain_people-1];
cout<<"out people:"<<people[out_people]<<endl;
people[out_people]=0;
}
else{
int out_people=temp[(m%remain_people)-1];
cout<<"out people:"<<people[out_people]<<endl;
people[out_people]=0;
}
}
}
int main(){
while(1){
int sum,m;
cout<<"input total number of people:"<<endl;
cin>>sum;
cout<<"input a number:"<<endl;
cin>>m;
joseph(sum,m);
char op;
cout<<"enter y to continue"<<endl;
cin>>op;
if(op!='y') break;
}
}
上面有点问题,用递归变得简单
#include<iostream>
using namespace std;
int joseph(int n,int m){
return n == 1 ? n : (joseph(n - 1, m) + m - 1) % n + 1;
}
int main(){
while(1){
int sum,m;
cout<<"input total number of people:"<<endl;
cin>>sum;
cout<<"input a number:"<<endl;
cin>>m;
int out_people=joseph(sum,m);
cout<<"out people:"<<out_people<<endl;
char op;
cout<<"enter y to continue"<<endl;
cin>>op;
if(op!='y') break;
}
}