主题:高手们帮忙啊!!!
Josephu问题为: 设编号为 1,2,….,n的n个人顺时针围成一圈, 每个人除有编号外, 还持有密码, 且已给定初始密码m, 约定从编号为 k (1≤k≤n) 的人从1 开始报数, 数到 m的那个人出列, 取出它的密码作为新的密码m, 它的下一位又从1开始报数,数到m的那个人出列, 依此类推,直到所有人出列为止, 试输出出队者的编号序列.(分别用顺序存储结构和链式存储结构实现.)
例: n=4, k=1,初始密码m=2
例如:1# 3 2# 5 3# 2 4# 4
则出队者的编号序列: 2,4,3,1
解:
法一. 顺序存储结构: ( 上例用如下数组A[n ]存放)
num cord
1 3
2 5
3 2
4 4
其中: num 存放某人的编号
cord 存放某人的密码
1. 设当前人数为N (其初值是n )
当前密码为m (其初值是初始密码)
当前报数人地址为i, (其初值是k-1)
2. 计算报到m的人地址: i=(i+m-1)%N
输出A[i].num, 且A[i].cordm
删除元素A[i ],人数N减1
3. 反复2. 直到N为0为止
法二. 链式存储结构:
建立一个不带附加表头结点的单链表,头指针H指向最后一个结点,
每一个结点为:
num cord next
其中: num 为编号
cord 为密码
next 为下一个结点地址
1. 设P指向当前报数人的前一个结点,(初值为H)
M为当前报数密码(初值为m)
n为总人数
2.进行n-1步如下操作:
将指针P后移M-1步,让P正好移到要报数为M的人的前一个结点,
输出Pnextnum, M=Pnextcord, 删除Pnext所指结点
3. 输出P->num
例: n=4, k=1,初始密码m=2
例如:1# 3 2# 5 3# 2 4# 4
则出队者的编号序列: 2,4,3,1
解:
法一. 顺序存储结构: ( 上例用如下数组A[n ]存放)
num cord
1 3
2 5
3 2
4 4
其中: num 存放某人的编号
cord 存放某人的密码
1. 设当前人数为N (其初值是n )
当前密码为m (其初值是初始密码)
当前报数人地址为i, (其初值是k-1)
2. 计算报到m的人地址: i=(i+m-1)%N
输出A[i].num, 且A[i].cordm
删除元素A[i ],人数N减1
3. 反复2. 直到N为0为止
法二. 链式存储结构:
建立一个不带附加表头结点的单链表,头指针H指向最后一个结点,
每一个结点为:
num cord next
其中: num 为编号
cord 为密码
next 为下一个结点地址
1. 设P指向当前报数人的前一个结点,(初值为H)
M为当前报数密码(初值为m)
n为总人数
2.进行n-1步如下操作:
将指针P后移M-1步,让P正好移到要报数为M的人的前一个结点,
输出Pnextnum, M=Pnextcord, 删除Pnext所指结点
3. 输出P->num