题目描述:
解题思路:
1.暴力模拟法:通过设置一个01字符串来模拟灯泡的开关,双重循环模拟过程中的开关操作,最后为计算字符串中1的个数为答案。(这个方法会超时)
2.数学法:引用井水的题解思路
在模拟的过程中我们发现:
第1个灯泡会在第:1 轮被操作;
第5个灯泡会在第:1,5 轮被操作;
第9个灯泡会在第:1,3,9 轮被操作;
第20个灯泡会在第:1,2,4,5,10,20轮被操作;
…
可总结为:第I个灯泡会在 自己的因数 时被操作,如果因数的个数是奇数则最后状态为开;
题目可转化为求解有奇数个因数的灯泡序号的个数。
完全平方数的因数个数是奇数。(推理参考井水的题解)
题目就转化为统计N里面完全平方数的个数;
完整代码:
int res = 0;
for (int i = 1; i <= n; i++)
{
int temp = sqrt(i);
if (temp*temp == i)
res ++;
}
return res;
// 可通过总结规律发现 N里面的完全平方数的个数等于对N开根号取整
// 所以 可直接 return sqrt(n);耗时0;
结果展示