作业帮 > 综合 > 作业

matlab编程:编号,报数,求留

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/10 13:46:11
matlab编程:编号,报数,求留
有20个小朋友,按1,2,3,...,20编号围坐一圈,从第一个人开始从1到5报数,报到5的退出(不在在围成的圈内),从下一个开始,继续从1开始循环报数,报到5的退出,如此重复,最后剩下的一个小朋友发给奖品,求最后一个小朋友的初始编号.
一定要用matlab啊,求大神指教
代码是:
x = 0;
for i = 1:20
    x = mod(x+5, i);
end
disp(x+1);

% 将打印 7
如下转至【CSDN - cs_zlg的专栏】的博客:
问题提出:
n个人(编号1~n)围成一个圈,从1开始依次报数,报到m的出列,剩下的人继续从1开始报数(由刚出列的人的下一个人开始).求最后出列的人(胜利者)的编号.
为了讨论方便,先把问题稍微改变一下,并不影响原意:
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号.
我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):
   k   k+1   k+2   ...n-2,n-1,0,1,2,...k-2,并且从k开始报0.
现在我们把他们的编号做一下转换:
k     --> 0
k+1 --> 1
k+2 --> 2
...
k-2 --> n-2
变换后就成为了(n-1)个人报数的子问题,假如这个子问题的x是胜利者,那么根据上表寻找x对应的值,这个值就是n个人时的解.变回去的公式:x'=(x+k)%n=(x+m)%n.
如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了.(n-2)个人的解呢?当然是先求(n-3)的情况 ---- 这显然就是一个倒推问题.
令f[i]表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n]
递推公式
f[1]=0;
f[i]=(f[i-1]+m)%i;   (i>1)
有了这个公式,我们要做的就是从1至n顺序算出f[i]的数值,最后结果是f[n].因为实际生活中编号总是从1开始,我们输出f[n]+1
这个算法的时间复杂度为O(n).