日期:2014-05-20  浏览次数:20615 次

java的算法题
题目:有500个小朋友拉成一个圆圈,从其中一个小朋友开始依次编号1-500,从1号小朋友开始循环1-3报数,数到3的小朋友就退出。编写一个Java应用程序,计算出最 后一个小朋友的号码是多少?
求各路大神帮忙,最好能给出题目的思路和源代码及解析,万分感激!

------解决方案--------------------
http://topic.csdn.net/u/20120627/20/4f300b35-b616-4d3d-8a22-e5313f9fc3cb.html
------解决方案--------------------
这个就是那个叫约瑟夫环的问题.
------解决方案--------------------
public class Count3Quit {
public static void main(String[] args) {
boolean[] arr = new boolean[500]; //定义500个人
for(int i=0; i<arr.length; i++) {
arr[i] = true; //假设人还在为true,退出为false。
}

int leftCount = arr.length; //剩余人数
int countNum = 0; //数(1\2\3) int index = 0; //当前位置

while(leftCount > 1) {
//循环,知道只剩1个true为止
if(arr[index] == true) {
countNum ++;
if(countNum == 3) {
 //数到3,改false
countNum = 0;
arr[index] = false;
leftCount --;
}
}

index ++;

if(index > arr.length-1) { //当过了最后1人时,从头开始数
index = 0;
}
}

for(int i=0; i<arr.length; i++) {
  if(arr[i] == true) {
System.out.println(i);
}
}
}
}
------解决方案--------------------
不是这是一个环不断循环的 报数无线循环直到一个人都不剩 最后的那个就是要求的

你这个是要的出最后的人的最开始的座位号

最后剩两个人 这两个人也要反复报数淘汰一个
------解决方案--------------------
我那个不是无限循环报数,淘汰到最后1个人 然后打印那个人的编号。我记得尚学堂JAVA教程里有讲这么一道题
------解决方案--------------------
帮你看了下,在(尚学堂科技_java视频教程__第05章_数组)09_练习_7 20分钟的时候开始讲你说的这道题。你可以去下个视频看下
------解决方案--------------------
使用队列比较好 把1,2,4,6...等请出列排到500后面 等下一次报数 如果遇到3直接踢出列