大厅里有100盏灯,每盏灯都编了号码,分别为1-100。每盏灯由一个开关来控制。(开关按一下,灯亮,再按一下灯灭。开关的编号与被控制的灯相同。)开始时,灯是全灭的。现在按照以下规则按动开关。
第一次,将所有的灯点亮。
第二次,将所有2的倍数的开关按一下。
第三次,将所有3的倍数的开关按一下。
以此类推。第N次,将所有N的倍数的开关按一下。
问第100次按完以后,大厅里还有几盏灯是亮的。

如果不考虑算法的话,程序可能比较麻烦。定义一个集合,赋值(灯的编号和灯的状态),遍历集合(按照规则改变灯的状态),取值。

分析(考虑算法):

1,灯的状态只有两种:亮和灭。

2,对灯操作奇数次,灯的状态为两;对灯操作偶数次,灯的状态是灭。

3,对第n次,将所有n倍的灯按一下。由于n=1*n;n=i*j...... 所以n号灯被按的次数就是它所有因子的个数,其中相同的因子只算一次(如:1=1*1;4=2*2...)。这样推出完全平方数的所有因子的个数就是奇数个,而非完全平方数的则是偶数个。

得出的结论:1至100之间所有的完全平方数的个数就是灯亮的个数。

public int GetLightsOn(int n)
{
    int count=0;
    for(int i=1;i<=n;i++)
    {
        if(i*i<=n)
        {
           count++;   
        }
        else
        {
           break; 
        }
    }
   return count;
}

  

  

 

 posted on 2015-09-06 15:05  会飞的金鱼  阅读(224)  评论(0)    收藏  举报