实验目的:
熟悉循环链表的定义,建立方法及相关基本操作,理解循环链表的基本思想。
实验要求:
算法完善,考虑时间复杂度。
实验内容:
已知 n 个人(以编号 1,2,3...n 分别表示)围坐在一张圆桌周围。从编号
为 k 的人开始报数,数到 m 的那个人出列;他的下一个人又从 1 开始报数,数到
m 的那个人又出列;依此规律重复下去,直到只剩下一个人为止。
输入:n,m (m < n)
输出:剩下最后一个人的编号
实验代码:
#include<iostream>
using namespace std;
// 定义一个函数,用于计算圆周上第k个位置的人的编号
int circle(int N, int m, int k)
{
// 判断输入是否合法,如果不合法则输出错误信息并返回-1
if (N <= 0 || m <= 0)
{
cout << "error!" << endl;
return -1;
}
else
{
// 如果总长度为1,那么只有一个人,直接返回0
if (N == 1)
{
return 0;
}
else
{
// 递归计算圆周上第k个位置的人的编号
return ((circle(N - 1, m, k) + m) % N);
}
}
}
int main()
{
int N, k, m;
cout << "请输入总长度" << endl;
cin >> N;
cout << "请输入间距" << endl;
cin >> m;
cout << "请输入初始位置" << endl;
cin >> k;
cout << endl << "结果:" << endl;
// 输出圆周上第k个位置的人的编号
cout << circle(N, m, k) + 1 << endl;
}
实验结果截图: