import java.util.Scanner; |
/** |
* 约瑟夫问题 |
* 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,下个人继续开始从1开始数,问最后留下的是原来第几号。 |
* (例如有【A B C D】4人参加,编号分别是1 2 3 |
* 4,其中A-1表示A君报数1,报数序列为:A-1,B-2,C-3【C退出】,D-1,A-2,B-3【B退出】,D-1,A |
* -2,D-3【D退出】,最后剩下A君 ,而A君的原始编号是1,那么最后答案是1) |
*/ |
public class Demo { |
public static void main(String[] args) { |
System.out.println( "游戏人数:" ); |
Scanner s = new Scanner(System.in); |
int n = s.nextInt(); |
boolean [] arr = new boolean [n]; |
for ( int i = 0 ; i < arr.length; i++) { |
arr[i] = true ; // 下标为TRUE时说明还在圈里 |
} |
int leftCount = n; |
int countNum = 0 ; |
int index = 0 ; |
System.out.print( "出圈序列:" ); |
while (leftCount > 1 ) { |
if (arr[index] == true ) { // 当在圈里时 |
countNum++; // 报数递加 |
if (countNum == 3 ) { // 报道3时 |
countNum = 0 ; // 从零开始继续报数 |
arr[index] = false ; // 此人退出圈子 |
System.out.print((index + 1 ) + " " ); // 数组起始下标是0,标号的起始值是1 |
leftCount--; // 剩余人数减一 |
} |
} |
index++; // 每报一次数,下标加一 |
if (index == n) { // 是循环数数,当下标大于n时,说明已经数了一圈, |
index = 0 ; // 将下标设为零重新开始。 |
} |
} |
for ( int i = 0 ; i < n; i++) { |
if (arr[i] == true ) { |
System.out.println( "\n最后剩下的人是 " + (i + 1 ) + " 号" ); // 数组起始下标是0,标号的起始值是1 |
} |
} |
} |
} |
高级设计师
by: 神马 发表于:2012-09-30 22:57:02 顶(0) | 踩(0) 回复
50000000人游戏,最后剩下13783435号...
回复评论