题目描述
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
用循环链表实现约瑟夫环。
输入
输入多组测试数据,每组测试数据格式如下:
人数n(>0) 开始位置k(>0) 报数m(>0)
输出
对每组测试数据,输出出圈顺序。
样例输入
3 1 2
5 3 3
样例输出
2 1 3
5 3 2 4 1
代码实现:
方法一:
#include<bits/stdc++.h>
using
namespace
std;
struct
lian{
int
num;
lian *next;
};
lian *head;
lian *create(
int
n)
{
head=NULL;
int
i;
lian *ps,*pend;
pend=NULL;
for
(i=1;i<=n;i++)
{
ps=
new
lian;
ps->num=i;
if
(head==NULL)
head=ps;
else
pend->next=ps;
pend=ps;
}
pend->next=head;
return
head;
}
void
jose(
int
n,
int
k,
int
m,lian *head)
{
int
count=0,x=0;
lian *nowloc,*temp,*h=head;
while
(1)
{
if
(h->next==head)
break
;
h=h->next;
}
while
(1)
{
x++;
if
(x==k)
//开始位置的前一个
{
nowloc=h;
break
;
}
h=h->next;
}
count=0;
int
total=0;
while
(1)
{
if
(total==n-1)
break
;
count++;
if
(count%m==0)
{
total++;
cout<<nowloc->next->num<<
" "
;
temp=nowloc->next;
nowloc->next=nowloc->next->next;
delete
temp;
}
else
nowloc=nowloc->next;
}
cout<<nowloc->num<<endl;
}
int
main()
{
lian *h;
int
n,k,m;
//人数,开始位置,报数
while
(cin>>n>>k>>m)
{
h=create(n);
jose(n,k,m,h);
}
return
0;
}
方法二:
|