约瑟夫环(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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读