当n个人围成一圈并以m为步长第一次报数时,第m个人出列,此时就又组成了一个新的,人数为n-1的约瑟夫环,要求n个人的约瑟夫环问题的解,就依赖于求n-1个人的约瑟夫问题的解,要求n-2个人的约瑟夫问题的解,则依赖于求n-2个人的约瑟夫换问题的解,依次类推,直至求1个人的时候,...
约瑟夫环问题的两种解法(循环链表和公式法)约瑟夫环问题的两种解法(循环链表和公式法)问题描述 这⾥是数据结构课堂上的描述:N people form a circle, eliminate a person every k people, who is the final survior?Label each person with 0, 1, 2, ..., n - 1, denote(表⽰,指代) J(n, k)...
很简单,同样的道理,公式又出来了,x=(x'' m)%5,这里变成5了。即求n-1个人的问题就是找出n-2的人的解,n-2就是要找出n-3,等等 因此,就可以回去看上面的推导过程了。 好了,思路出来了,下面写递推公式: 令f[i]表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n] 递推公式 f[1]=0; ...
f[n] = (f[n-1] + m)%n //m表示每次数到该数的人出列,n表示当前序列的总人数 而我们只需要得到第n次出列的结果即可,那么不需要另外声明数组保存数据,只需要直接一个for循环求得n阶约瑟夫环问题的结果即可 由于往往现实生活中编号是从1-n,那么我们把最后的结果加1即可。 公式 #include <bits/stdc++....
约瑟夫环公式的问题 f(N,M)=(f(N−1,M)+M)%N 已知公式如上,如果n=41, m=3,最后的结果是多少? 高中数学都忘完了,只知道这个好像是个函数。不知道怎么计算。 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿...
约瑟夫环问题(通过观察得出递推式从而建立递归求解),问题大意:m个人围坐成一圈,编号为0~m-1,从0号的人开始报数,他先报0,报到k-1的那个人出局,然后下一个人继续从0开始报,下一个报到k的人又出局……一直重复直到最后环内剩下一个人,求这个人的编号。除了直接用链
答:这可以看成是上一个问题的逆过程,所以由 10 变成 11 个人时,所有人都往后移动 3 位,所以 J(11,3)=J(10,3)+3J(11,3)=J(10,3)+3,不过数组可能会越界,我们可以想象成数组的首尾是相接的环,那么越界的元素就要重新回到开头,所以这个式子还要模上当前的人数(注意,这里是当前数组,在这里就是人数为 ...
cout <<"The winner is No."<<index<<".\n";//少了个后引号 while(count<M)// 对成功的报数开始计数 { index=(index+1)%N;//计算要报数的小孩编号 这步谁能帮我分析下?if (in_circle[index])count++;} 这个循环的作用就是让还在环中的小孩报数,考虑到报到队尾时必须回到头再重报,...
}intw,s; scanf("%d,%d",&w,&s);intt=w-1;while(n!=0) { t=(t+s-1)%n;///约瑟夫环公式,t=出局的人的序号(起始时为一开始报数的人的序号)+报数号-1%现有的人数printf("%s\n",name[t]);for(inti=t; i!=n-1; i++) {
这里面的约瑟夫环不是关键。关键是一个 Magic number,见下: A)讲解一下公式: 预备程序:首先需要从复数(a+bi)的角度来考虑问题。这里将实数部为 a,虚数部为 —a。取 1,2,3,4 为 m 张牌。一折为二,叠摞一块。这 m 张牌的另外一半,我们按复数认定为 —m 个半牌。即前半摞 1,2,3,4,后半摞:...