约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,
数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列.
1、数组实现
void JosephArrary(int a[],int n,int k)
{
int count,len,i,j,m;
int *b=new int[n];
count=0;len=n;
i=0;j=0;m=0;
while(len>0)
{
if(a[j]!=-10000) //剔除0的影响 如果设置a[j]!=0,输入数组中有0,不能通过
{
count++;
if(count==k)
{
b[m++]=a[j];
a[j]=-10000;
count=0;
len--;
}
}
j++;
if(j==n)
j=0;
}
for(i=0;i<n;i++)
cout<<b[i]<<" ";
cout<<endl;
delete [] b;
}
2、链表实现
struct node
{
int data;
node *next;
};
node * CreateLink(int n)
{
node *p,*q,*head;
head=new node;
q=new node;
head=q=NULL;
int data;
for(int i=0;i<n;i++)
{
p=new node;
cin>>data;
p->data=data;
if(head==NULL)
head=q=p;
else
{
q->next=p;
q=p;
}
}
q->next=head;
return q; //考虑到报数为1出环的情况
}
void JosephLink(node *head,int len,int k)
{
node *p,*t;
p=new node;
int count,n;
count=0;
n=0;
p=head;
while(p)
{
t=p->next;
count++;
if(count==k)
{
cout<<t->data<<" ";
count=0;
p->next=p->next->next;
delete t;
n++;
if(n==len)
return;
}
p=p->next;
}
cout<<endl;
}