1.n个人围成一圈,从第一个人开始报数,报m的人出队,直至报到最后一个人为止。
循环单链表:
#include <iostream>
//约瑟夫环
using namespace std;
struct Node{
int data;
Node *next;
};
class JosephRing{
private:
Node *rear;
public :
JosephRing(int n);//初始化n个结点的循环单链表
~JosephRing();
void joseph(int m);//密码是m,打印出环的顺序
};
JosephRing::JosephRing(int n){
Node *s=NULL;
rear=new Node;
rear->data=1;rear->next=rear;
//建立长度为1的循环单链表
//依次插入数据域为2,3……n的结点
for(int i=2;i<=n;i++){
s=new Node;
s->data=i;
s->next=rear->next;//将结点s插入结点rear的后面
rear->next=s;
rear=s;//将rear再次指到尾部
}
}
void JosephRing::~JosephRing(){
}
void JosephRing::joseph(int m){
Node *pre=rear,*p=rear->next;
int count=1;
cout<<"出环的顺序是:";
while(p->next!=p){
if(count<m){
pre=p;p=p->next;
count++;
}else{
cout<<p->data<<" ";
pre->next=p->next;
delete p;
p=pre->next;
count=1;
}
}
cout<<p->data<<" ";
delete p;
}
int main()
{
int n,m;
cout<<"请输入约瑟夫环的长度:";
cin>>n;
cout<<"请输入密码:";
cin>>m;
JosephRing r(n);
r.joseph(m);
return 0;
}
2.n个人围成一圈,从第k个人开始报数,报m的人出队,直至报到最后一个人为止。
数组:
#include <iostream>
using namespace std;
int del(int *arr,int index,int &len){
//将出队的人的序号从数组中删除(覆盖)
int a=arr[index];
for(int i=index;i<len;i++){
arr[i]=arr[i+1];
}
//删除后数组长度减1
len=len-1;
return a;
}
void josephRing(int *arr,int n,int k,int m){
//开始数的人的下标
int index=k-1;
//数组长度
int len=n;
while(len>1){
index=(index+m-1)%len;
//出队顺序
cout<<del(arr,index,len)<<" ";
}
//最后一个人
cout<<arr[0]<<endl;
}
int main(){
int n,k,m;
cout<<"请输入人数:"<<endl;
cin>>n;
cout<<"请输入从第几个人开始:"<<endl;
cin>>k;
cout<<"请输入数到哪个数出队"<<endl;
cin>>m;
int *arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=i+1;//数组中存储人的序号1~n
}
josephRing(arr,n,k,m);
return 0;
}