大厅里有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
浙公网安备 33010602011771号