CSDN报数游戏

今天看了下CSDN上的编程题目(报数游戏),题目如下:

题目详情

N个人(编号1-N),站成一排,进行报数游戏。报数过程可能进行很多轮,有如下规则:

(1)  如果剩余人数不超过3个人,则游戏结束。

(2)大家报数,然后留下报奇数的人从第一个人继续游戏,或者留下报偶数的人继续游戏。

重复如此(1)(2)两步骤,到游戏结束。

问:最终剩下的三人组有多少种情况?(注意是三人组,例如如果最后剩下2个或者1个人,不计入结果中)。

输入n, (0<n<=10000000)

输出最终结果。

自己实现了下,代码如下,欢迎丢砖....


import java.util.Scanner;

/**
 * 题目详情

 * N个人(编号1-N),站成一排,进行报数游戏。报数过程可能进行很多轮,有如下规则:

 * (1) 如果剩余人数不超过3个人,则游戏结束。

 * (2)  大家报数,然后留下报奇数的人从第一个人继续游戏,或者留下报偶数的人继续游戏。

 * 重复如此(1)(2)两步骤,到游戏结束。

 * 问:最终剩下的三人组有多少种情况?(注意是三人组,例如如果最后剩下2个或者1个人,不计入结果中)。

 * 输入n, (0<n<=10000000)

 * 输出最终结果。 
 *
 */
public class Test {

	public static void main(String[] args) {
		System.out.println("请输入总人数:");
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		System.out.println(howmany(n));
	}
	
	public static int howmany(int n){
		int sum = 0;
		if(n==3){
			sum = 1;
		}else if(n>3){
			int[] num = new int[n];
			for(int i=0;i<n;i++){
				num[i] = i+1;
			}
			sum = countSum(num,1)+countSum(num,2);
		}
		return sum;
	}
	
	/**
	 * 
	 * @param num 数组
	 * @param type 类型(1奇数,2偶数)
	 * @return
	 */
	public static int countSum(int[] num, int type){
		int len = num.length;
		if(len < 3){
			return 0;
		}
		int subLen = type==1?(len-1)/2+1:len/2;
		int num2[] = new int[subLen];
		for(int i=0;i<subLen;i++){
			num2[i] = num[type==1?2*i:2*i+1];
		}
		if(num2.length==3){
			return 1;
		}
		return countSum(num2,1)+countSum(num2,2);
	} 
	
	

}


你可能感兴趣的:(CSDN报数游戏)