初始时有 n 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 i 个灯泡切换一次开关。 对于第 n 轮,你只切换最后一个灯泡的开关。 找出 n 轮后有多少个亮着的灯泡。
示例:
输入: 3 输出: 1 解释: 初始时, 灯泡状态 [关闭, 关闭, 关闭]. 第一轮后, 灯泡状态 [开启, 开启, 开启]. 第二轮后, 灯泡状态 [开启, 关闭, 开启]. 第三轮后, 灯泡状态 [开启, 关闭, 关闭]. 你应该返回 1,因为只有一个灯泡还亮着。
思路:
本题灯泡最后是亮还是灭与它的公因子数量有关,如果公因子数量为奇数,那么最后就是亮的,如1,4,9。大部分奇数的公因子数量其实也是偶数(1和本身),也有奇数的公因子数量为奇数比如9,25。
说到这里其实大家应该发现了规律,偶数一般情况下公因子数量必然是成双成对的,奇数同理,只有少部分数存在同一个数自乘得到该数,也就是完全平方数才有奇数项的因子。
所以这题转换成了求在1-n范围内的完全平方数的数量
Code:
class Solution {
public:
int bulbSwitch(int n) { //你会发现除了完全平方数之外的奇数和偶数最后都为零 所以本题变为求完全平方数的个数
int cnt=0;
for(int i=1;i*i<=n;i++)cnt++;
return cnt;
}
};