初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
示例:
输入: 3 输出: 1 解释: 初始时, 灯泡状态 [关闭, 关闭, 关闭]. 第一轮后, 灯泡状态 [开启, 开启, 开启]. 第二轮后, 灯泡状态 [开启, 关闭, 开启]. 第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 你应该返回 1,因为只有一个灯泡还亮着。
转自https://blog.csdn.net/vhghhd/article/details/80904662
解题:
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));