319. Bulb Switcher(Medium)

1.该问题是算法设计问题中的一个经典问题:开关翻转问题。

2.根据题意,我们可以把题目转化为,被翻转偶数次的灯是灭的,被翻转奇数次的灯是亮的。

3.那么问题可以继续转化为:什么编号的灯被翻转奇数次?

4.进一步转化:编号为n的灯,n有若干个因数(注意不是质因数),那么它会被它的因数进行翻转操作,也就是说,如果有奇数个因数,那么编号为n的灯就会被翻转奇数次,即最终是亮的。如数字4,因数为1、2、4;数字9号,因数为1、3、9;

5.问题可以继续转化:如果判断数字n的因数有奇数个?

每个数都可以化简成质因数的乘式n=(a[i]^p[i])*(a[i+1]^p[i+1])…….其中a[i]为质数,p[i]为数字n包含质数a[i]的多少次方。

那么n的因数总数为:(p[i]+1)*(p[i+1]+1)…….

使得因数的总数为奇数,那么每个项都应该是奇数,即p[i]+1为奇数,那么p[i]为偶数。

如果p[i]为偶数,那么a[i]^p[i]为a[i]^2、a[i]^4、a[i]^6等等,即这些数是为完全平方数,例如4,9,16,25等等。

6.所以,题目要求的是,n以内的完全平方数的个数。

AC代码如下:
[c language=”++”]
class Solution {
public:
int bulbSwitch(int n) {
int result = 0;
for (int i = 1; i*i <= n; i++)
result++;
return result;
}
};
[/c]
 

Leave a Reply

Your email address will not be published. Required fields are marked *