需要转从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
之前是使用C语言,换成matlab语言进行作答。
软件版本为matlab2017版。
参考GPT和自己的思路:
这是一个经典的约瑟夫问题(Josephus Problem),可以使用循环链表或者递归算法来解决。下面是使用 MATLAB 语言的循环链表算法示例代码:
n = input('请输入总人数n:');
m = 3; % 报到3的人退出
% 初始化循环链表
head.prev = n;
for i = n-1:-1:1
p = struct('prev', i+1, 'next', []);
p.next = head;
head.prev = i;
head = p;
end
% 开始报数
p = head;
while p.next ~= p
for i = 1:m-1
p = p.next;
end
p.next.prev = p.prev;
p.prev.next = p.next;
p = p.next;
end
% 输出最后留下的人的编号
disp(['最后留下的是原来第', int2str(p.prev+1), '号的那位。']);
其中,struct
函数用于创建结构体,int2str
函数用于将整数转换为字符串。