亮着电灯的盏数 一条长廊里依次装有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; }