题目:300名士兵分别编号为1-300,按顺序排成一排,长官下令:“双数士兵出列!”,剩下的士兵重新按原序编号.长官下令:“双数士兵出列!”,如此进行下去直到最后只剩下一名士兵.求最后剩下的这名士兵的原始号码是多少,若长官下的令是:”单数士兵出列!“最后剩下的这名士兵的原始号码是多少。
程序分析:
(1)若是双数士兵出列,由于原来排在第一号的士兵每次都是先报号,且是单数,所以每次都不会出列,即最后剩下的是1号.
(2)若是单数士兵出列,经过n轮后(n为正整数),剩下士兵的编号为2的n次幂;2的n次幂≤300,2的8次幂=256,2的9次幂=512,所以n=9,当圆圈只剩一个人时,n=8,这个士兵的编号为2n=28=256.
import java.util.Scanner;
/**
* @author zql
*/
public class Test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入士兵人数:");
int count = in.nextInt();
System.out.println("请下命令:1.双数士兵出列。2.单数士兵出列。");
int command = in.nextInt();
if (command == 1) {
System.out.println("最后剩下的这名士兵的原始号码:" + 1);
} else {
System.out.println("最后剩下的这名士兵的原始号码:" + getEndOriNo(count));
}
in.close();
}
/**
* @param count 士兵人数
* @return 最后剩下的这名士兵的原始号码
*/
public static int getEndOriNo(int count) {
boolean flag = true;
// 底数
int n = 2;
// 幂
int factorial = 1;
// 前一个幂
int front = 0;
while (flag) {
factorial *= n;
if (factorial > count) {
flag = false;
} else {
front = factorial;
}
}
return front;
}
}