今天看视频教程无意间看到了一个数3减1的问题,百度之发现叫约瑟夫环问题,于是写了程序,问题大致描述如下:
一群带有编号的孩子手拉手围成一个圈报数,开始的孩子数1,他右边数2,再右边数3,数到n的孩子out,接着从下一个孩子开始继续数1,数到n的孩子out,如此循环...问最后留下来的孩子是原来的多少号?
我这里用Java写了一个双向回环链表代表围成的圈,其中的Kid是一个链表节点,他有一个左同胞,一个右同胞,还有一个id。双向会还链表定义了添加节点方法add(),删去节点方法delete();队首孩子firstKid,队尾孩子LastKid,还有表的长度count。
class Kidcircle{ private int count; Kid firstKid; Kid LastKid; Kidcircle(int num){ count = 0; for(int i=0;i
Kid类如下:
class Kid{ Kid left; Kid right; int id;}
然后main方法中这么写的,我假设的是数到3淘汰一个孩子,然后一共500人:
public class count3quit { public static void main(String[] args){ Kidcircle Kc = new Kidcircle(500); Kid currentKid = Kc.firstKid; while(Kc.getSize()>1){ Kc.delete(currentKid.right.right); currentKid = currentKid.right.right; } System.out.println(Kc.firstKid.id); }}
最后结果:436。
有时间还是要多回顾数据结构中的东西。