关于约瑟夫环在java中具体实现的问题
Josephus问题的通解公式是
,
其中
表示
个人玩约瑟夫杀人游戏,每次报号
倍数的人被干掉的规则下最终剩下的那个人原本的标号。所以可以直接这么写(我就直接写个C++版的了,Java好久没用过了)#include \u0026lt;iostream\u0026gt;int main() {\tint f = 1, n = 17, k = 3;\tfor (int i = 2; i \u0026lt;= n; i++)\t\tf = ((f + k - 1) % i) + 1;\t\tstd::cout \u0026lt;\u0026lt; f - 1;\treturn 0;}最后答案是10
■网友
表示c中可以用单循环列表解决
■网友
如果你改成50那么就不能除去3号,说明你的最后一次循环只剩下3跟10了,还需要最后一次来剔除可以被3整除的元素。以下是你的程序改成50次的结果。2号被淘汰了5号被淘汰了8号被淘汰了11号被淘汰了14号被淘汰了0号被淘汰了4号被淘汰了9号被淘汰了13号被淘汰了1号被淘汰了7号被淘汰了15号被淘汰了6号被淘汰了16号被淘汰了12号被淘汰了0-\u0026gt;-\u0026gt;-11-\u0026gt;-\u0026gt;-12-\u0026gt;-\u0026gt;-13-\u0026gt;-\u0026gt;484-\u0026gt;-\u0026gt;-15-\u0026gt;-\u0026gt;-16-\u0026gt;-\u0026gt;-17-\u0026gt;-\u0026gt;-18-\u0026gt;-\u0026gt;-19-\u0026gt;-\u0026gt;-110-\u0026gt;-\u0026gt;4911-\u0026gt;-\u0026gt;-112-\u0026gt;-\u0026gt;-113-\u0026gt;-\u0026gt;-114-\u0026gt;-\u0026gt;-115-\u0026gt;-\u0026gt;-116-\u0026gt;-\u0026gt;-1是不是说明你还需要最后一次循环来剔除最后一个元素,然后在那一次循环里面10号又不是-1也不能被3整除,那么就等于最后一次循环的count值,也就是50。看看我写的程序吧,其实刚刚入门都是这样的,当时我连3个数比大小都写不出来~~public class Solution {\tpublic static void main(String args) {\t\tgetAnswer(17);\t}\tprivate static void getAnswer(int n) {\t\t// TODO Auto-generated method stub\t\t//用于判断某个数是否已经被剔除\t\tboolean isChoosed=new boolean;\t\t//记录答案数组\t\tint array=new int;\t\t//记录人数\t\tint num=n;\t\t//记录循环次数,最后的值就能知道你必须要数多少次,才能剩下一个人\t\tint count=0;\t\t\t\t//如果人数只有一个人的时候,就结束循环\t\t\twhile(num!=1){\t\t\t//每一次的循环\t\t\tfor(int i=0;i\u0026lt;n;i++){\t\t\t\t//如果这个位置没有被选择,也就是没有被删除,那么就给他赋值\t\t\t\tif(!isChoosed){\t\t\t\t\tcount++;\t\t\t\t\tarray=count;\t\t\t\t\tif(count%3==0){\t\t\t\t\t\tisChoosed=true;\t\t\t\t\t\tnum--;\t\t\t\t\t\tSystem.out.println((i+1)+"号被淘汰了");\t\t\t\t\t}\t\t\t\t}\t\t\t\t\t}\t\t}\t\t\t\t//打印输出的结果\t\tfor(int i=0;i\u0026lt;n;i++){\t\t\tSystem.out.println((i+1)+"-\u0026gt;-\u0026gt;" +array);\t\t}\t}}
■网友
【关于约瑟夫环在java中具体实现的问题】 我用循环链表写的这个,个人感觉理解和实现起来比较容易,虽然写的有个小100行
■网友
觉得你初始化为-4的循环完全没有必要,而且导致了你出现奇怪的结果,直接初始成1到17的数组即可 因为-4不是3的倍数,也不等于-1,所以17行的for循环在第一次运行的时候一个人都没死。这导致场上的人死亡的时晚了一圈:在0号,1号分别被赋值为18,19之后,上一轮本该死去的2号才喊出3然后死去。所以,在只剩3号和10号在场上的时候,10号已经更新成49了,3号仍然坚挺,此时count=50。如果16行的while调成while count 小于 50, 三号侥幸存活。如果 while count 小于51, 按照你的程序,要等到10号被更新成50后才结束循环。所以,最后活下来的10号值是50……PS:你们在是怎么写代码的!?!只要打一个小于号就出bug.... 的sanitize做得是什么玩意儿……
推荐阅读
- 过节■江苏省委省政府办公厅下发关于做好2021年元旦春节期间有关工作的通知
- 经济顾问委员会|
- |徐州市出台《关于优化创新创业生态系统 提升区域科技创新活力的实施意见》及实施细则
- 雨下|全球关于禁售燃油车只是理论上可行吗
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- 关于用phpfsocket 写Post, 模拟http 报文怎样写入要传输的处理数据
- 智叔|很多家长还在整箱买:谈谈关于牛奶的17个真相警惕这些列入黑名单的“假牛奶”
- 关于微信小程序的思考:运营者该何去何从
- 关于人工智能虚拟人的一些问题
- 知乎上关于人生经验的介绍是否可能对青少年造成潜在危害
