约瑟夫问题

来源:互联网 发布:淘宝店铺名化妆品 编辑:程序博客网 时间:2024/05/15 06:08

500个人围成一个圈 从第一个开始数,只要是三的倍数,就退出,下一个人从头开始数,求最后那个人的序号。

public class CountThreeQuit {public static void main(String[] args) {  boolean[] arr = new boolean[500];  for(int i =0;i<arr.length;i++) {  arr[i] = true;  }  int leftCount = arr.length; //剩余人数  int countNum = 0;     //计数  int index = 0;  //当前人的位置  while(leftCount >  1) {  if(arr[index]) {  countNum ++;  if(countNum == 3) {  countNum = 0;  arr[index] = false;  leftCount --;  }  }  index++;  if(index == arr.length) {  index = 0;  }  }    for(int i=0;i<arr.length;i++) {  if(arr[i]){  System.out.println(i+1);  }  }}}

面向对象的思路

public class CountThreeQuit2 {public static void main(String[] args) {KidCircle kc = new KidCircle(500);int countNum = 0;Kid k = kc.first;while(kc.count > 1) {countNum++;if(countNum == 3 ) {countNum = 0;kc.dele(k);}    k = k.right;}System.out.println(k.id);}}class Kid {int id;Kid left;   //左边的小孩Kid right;}class KidCircle {int count = 0;Kid first ,last; //开头,结尾的小孩KidCircle(int n) {for(int i=0;i<n;i++) {add();}}void add() {Kid k = new Kid();k.id = count ;if(count <= 0) {first = k;last = k;k.left = k;k.right = k;}else {last.right = k;k.left = last;k.right = first;first.left = k;last = k;}count++;}void dele(Kid k) {   if(count<=0) {   return ;   }else if(count == 1){   first = last = null;   }else {   k.left.right = k.right;   k.right.left = k.left;   if(k == first) {   first = k.right;   }else if(k == last) {   last = k.left;   }   }   count--;}}


0 0
原创粉丝点击