有n个人围成一圈,顺序排号。

需要转从第一个人开始报数(从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 函数用于将整数转换为字符串。