题目一:Nim游戏
思路:如果在你的回合里,有1、2、3块,则你可以把它们全部拿走,从而获得胜利,但是如果有4个,那无论你拿几个都会给对方剩下,且剩下的对方可以全部拿走,如果有5个,6个或者7个的话,那么你可以控制自己拿的个数从而让对方回合时剩下4个,从而自己获得胜利,由此类推,可得为了自己获得胜利,应当避免在自己回合时剩下4个,即石块个数不是4的倍数。
代码:
public static boolean canWinNim(int n) {
return n%4!=0;
}
运行成功截图:
题目二:灯泡开关
思路:
* n=2 num=1 * n=3 num=1
* 1 1 * 1 1 1
* 1 0 * 1 0 1
* 1 0 0
等等。经过分析可知,当灯泡变换奇数次时,最终灯泡为亮。所以就可以转换成每个灯泡有几个约数,如果约数个数为奇数,则最终灯泡为亮,所以可以转换成求[1,n]中的约数个数为奇数的个数。又因为如果k是x的约数,则x/k也是x的约数,所以为了使约数个数为奇数,则必定有x=x/k,所以x为完全平方数,例如4=2*2,4的约数为奇数,所以就可以转换成求[1,n]中完全平方数的个数,由推论可知[1,n]中完全平方数的个数等于根号n下取整。
代码:
public static int bulbSwitch(int n) {
return (int)Math.sqrt(n);
}
运行成功截图: