matlab编程:编号,报数,求留有20个小朋友,按1,2,3,...,20编号围坐一圈,从第一个人开始从1到5报数,报到5的退出(不在在围成的圈内),从下一个开始,继续从1开始循环报数,报到5的退出,如此重复,
来源:学生作业帮助网 编辑:作业帮 时间:2024/07/18 23:13:20
![matlab编程:编号,报数,求留有20个小朋友,按1,2,3,...,20编号围坐一圈,从第一个人开始从1到5报数,报到5的退出(不在在围成的圈内),从下一个开始,继续从1开始循环报数,报到5的退出,如此重复,](/uploads/image/z/12688185-57-5.jpg?t=matlab%E7%BC%96%E7%A8%8B%EF%BC%9A%E7%BC%96%E5%8F%B7%2C%E6%8A%A5%E6%95%B0%2C%E6%B1%82%E7%95%99%E6%9C%8920%E4%B8%AA%E5%B0%8F%E6%9C%8B%E5%8F%8B%2C%E6%8C%891%2C2%2C3%2C...%2C20%E7%BC%96%E5%8F%B7%E5%9B%B4%E5%9D%90%E4%B8%80%E5%9C%88%2C%E4%BB%8E%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%A7%8B%E4%BB%8E1%E5%88%B05%E6%8A%A5%E6%95%B0%2C%E6%8A%A5%E5%88%B05%E7%9A%84%E9%80%80%E5%87%BA%EF%BC%88%E4%B8%8D%E5%9C%A8%E5%9C%A8%E5%9B%B4%E6%88%90%E7%9A%84%E5%9C%88%E5%86%85%EF%BC%89%2C%E4%BB%8E%E4%B8%8B%E4%B8%80%E4%B8%AA%E5%BC%80%E5%A7%8B%2C%E7%BB%A7%E7%BB%AD%E4%BB%8E1%E5%BC%80%E5%A7%8B%E5%BE%AA%E7%8E%AF%E6%8A%A5%E6%95%B0%2C%E6%8A%A5%E5%88%B05%E7%9A%84%E9%80%80%E5%87%BA%2C%E5%A6%82%E6%AD%A4%E9%87%8D%E5%A4%8D%2C)
matlab编程:编号,报数,求留有20个小朋友,按1,2,3,...,20编号围坐一圈,从第一个人开始从1到5报数,报到5的退出(不在在围成的圈内),从下一个开始,继续从1开始循环报数,报到5的退出,如此重复,
matlab编程:编号,报数,求留
有20个小朋友,按1,2,3,...,20编号围坐一圈,从第一个人开始从1到5报数,报到5的退出(不在在围成的圈内),从下一个开始,继续从1开始循环报数,报到5的退出,如此重复,最后剩下的一个小朋友发给奖品,求最后一个小朋友的初始编号.
一定要用matlab啊,求大神指教
matlab编程:编号,报数,求留有20个小朋友,按1,2,3,...,20编号围坐一圈,从第一个人开始从1到5报数,报到5的退出(不在在围成的圈内),从下一个开始,继续从1开始循环报数,报到5的退出,如此重复,
代码是:
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).