Bootstrap

N个人开关N盏灯的问题的思考

问题:有N个灯放在一排,从1到N依次顺序编号。有N个人,也从1到N顺序编号。1号将灯全部关闭,2号将凡是2的倍数的灯全部打开;3号将3的倍数的灯全部作相反操作(该灯如为打开,则将它关闭;如关闭,则将灯打开)。以后的人,都和3号操作一样,将凡是自己序号倍数的灯作相反操作。第N个人操作完之后,一共有几盏灯亮着?解题:1. 第M(M<N)个人的操作只能影响到后面M到N盏灯,无法影响到前M-1盏灯,所以第M个人操作后,这个状态下灯的亮灭个数F(M)=F(M-1)+0/1(当第M盏灯操作了偶数次时,加0;当第M盏灯操作了奇数次时,加1)2. 第M盏灯操作了多少次,等价于M这个数有多少个因数,所以F(M)=F(M-1)+0/1(M的因子个数为偶数,加0;M的因子个数为奇数,加1)3. 一个数要么是素数,因子个数为2(1和它自身),要么是合数,因子个数为奇数(只含有1个质因子,即为平方数时)或偶数(假设其有n个质因子,则其因数的总个数为C0n+C1n+…CNn,化简后为若n为偶数,2x(C0n+C1n+…+C((n-1)/2))+C(n/2)n),偶数+偶数=偶数;若n为奇数2x(C0n+C1n+…+C((n-1)/2)),2x任意数=偶数 )4. 所以,只有这个数为平方数时,其因子的个数才为奇数5. 所以,F(M)=F(M-1)+0/1(当M为非平方数时,加0;当M为平方数时,加1)6. 所以,此问题最终公式为:对N开根号,将其整数部分提取出来即为答案7. 编程实现:result = (int)(sqrt(N));

;