开灯和灭灯

有100盏灯和100个开关,刚开始的时候等全是灭的,someone第一轮按下所有开关(开的按一下变灭,灭的按一下变开),第二轮隔一个按一下(偶数个按),第三轮隔2个(3的倍数个按),求第100轮之后有多少盏灯是亮的。

琥珀:

我是这么想的。因为灯要不是灭的,要不就是开的,结果只有这两个。

以第四盏灯为例。初始状态是灭,那么第一次能按下第四盏灯,此时灯亮。第二次能按下第四盏灯,灯灭。第三次按不到第四盏灯,依然灯灭。第四次能按到第四盏灯。灯亮。

对于第四盏灯而言,能按到的次数是第1次,第2次,第4次。也就是能按到的次数是奇数次的话,灯亮,偶数次,灯灭。

对于第n盏灯而言,肯定都是能按到第一次和第n次的,我们只要求在[1,n]之间,有多少个数能被n整除就行。如果是奇数次的话,灯亮,偶数次,灯灭。

用java来实现的话,如下:

/**
*
* @author Administrator
* 有100盏灯和100个开关,刚开始的时候等全是灭的,someone第一轮按下所有开关(开的按一下变灭,灭的按一下变开),
* 第二轮隔一个按一下(偶数个按),第三轮隔2个(3的倍数个按),求第100轮之后有多少盏灯是亮的。
*
*/
public class Light {

public static void main(String[] args) {
int light_on = 0;
for(int i = 1; i<=100 ;i++)
{
int count = Light.pressCount(i);
if(count%2 == 0)//偶数次灯灭,奇数次灯亮
{
System.out.println(i+"灯灭");
}else
{
System.out.println(i+"灯亮");
light_on++;
}
}
System.out.println("最终灯亮的盏数是:"+light_on);
}

/**
* 计算按下灯的次数
* @param n
* @return
*/
public static int pressCount(int n)
{
int count = 0;
for (int i = 1; i<= n; i++)
{
if(n%i==0)
{
count++;
}
}
return count;
}

}

算法还可以再优化。欢迎补充、吐槽

posted @ 2014-08-15 18:00  万表技术  阅读(172)  评论(0)    收藏  举报