约瑟夫问题是:大家共有n个人(编号0--n-1)围成一圈,从0开始报数,数到第m的人出圈(这里模拟的是2),求最后幸运者序号??
现在直接贴出每种解法的代码:
1.模拟循环链表
import java.util.Scanner; class Node { Node next; int data; Node(int data){ this.data=data; } } public class HuaWei2{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); while(scan.hasNext()){ int total = scan.nextInt(); Node first = new Node(0); Node pointer = first; //将输入的值依次插入 for(int i=1;i<total;i++){ pointer.next = new Node(i); pointer = pointer.next; } //插入结束后将尾指针指向头指针 pointer.next=first; //指针从新指向头结点,也可以新建Node pointer1 = first pointer = first; //i<3是因为我们从头结点开始,一直到需要删除结点的头一个节点。如果i=1,那么应该while(i<2); while(pointer!=pointer.next){ int i = 2 ; while(i<3){ pointer = pointer.next; i++; } System.out.println("删除的节点是:"+pointer.next.data); //将节点删除,并且将指针指向下一个开始的地方 pointer.next = pointer.next.next; pointer = pointer.next; } System.out.println("最后的幸运节点是:"+pointer.data); } } }
2.模拟游戏过程复杂度比较大。下面这种解法更加简洁
int Yuesefu(int M, int N) //总人数 M ,数到[b]第 N 个[/b]排除。K为从0开始对应的最后一个幸运人的下标,所以本题N=3;k=(k+3)%i { int k=0; for (int i = 2; i <= M; i++) k = (k + N) % i; }
参考文章为:http://blog.csdn.net/ericchan1986/article/details/5751677