【华为机试题】亮着电灯的盏数

时间:2020-12-07 18:52:39

亮着电灯的盏数 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。 有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。 注:电灯数和学生数一致。


算法思想:电灯操作偶数次等于没有操作,故最后电灯亮着的数目即为操作次数为奇数次的数目。那么哪些编号的灯会被操作奇数次呢?现在我们考虑1~n中任一一个数m,对于m的每一对因子i和j,在满足i*j=m时,i号学生和j号学生都会操作m号电灯。故如果m有偶数个因子,则最终电灯会处于关着的状态;如果m有奇数个因子,则必然存在一个因子k,使得k*k=m,此时m号电灯在最后会是亮着的。故本题其实就是求n以内能够写成一个数平方形式的数的个数。


代码如下:

#include <iostream>
using namespace std;
int myGetLightLampNum(int n){//凡是处于k^2处的灯泡都会被操作奇数次,其他地方的灯泡被操作偶数次,统计n以内有多少平方数就可以了
int k=1;
while(k*k<=n)
{
	k++;

}
return k-1;
}
int main(void){
	int num;
	while(cin>>num)
	{	
		cout<<myGetLightLampNum(num)<<endl;
		
	}
	system("pause");
	return 0;
}