约瑟夫环问题描述
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。要求输出最后一位出列的人的序号。
知识拆解
该问题主要包括两点:圆环的形成以及动态迭代。
圆环形成:
- 链表
- 数组
动态迭代:
- 对于链表,可以直接删除特定节点
- 对于数组,利用新数组重新存储每次更新后的数据;通过对数组数据移位来完成数据更新
解法
解法一:
- 预先定义足够大的数组,解决数据长度问题;
int num[1000] = {
0};
- 记录数组当前数据长度,当下标超出时,返回数组首部;
int i,m = N; //i--数组下标;N--数据录入的长度
if(i >= m)
i = 0; //返回数组首部
- 在规定编号处,数组数据前移,减小数据长度;
if(j == 3)
{
m--; //数据长度减1
printf(" %d ",num[i]);
for(n=i;n<m;n++)
{
num[n] = num[n+1]; //从该位置,数组数据前移
}
for(n=0;n<m;n++