开关灯问题

 

## 题目描述

假设有 N 盏灯(N 为不大于 5000 的正整数),从 1 到 N 按顺序依次编号,初始时全部处于开启状态;第一个人(1号)将灯全部关闭,第二个人(2 号)将编号为 2 的倍数的灯打开,第三个人(3 号)将编号为 3 的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和 3号一样,将凡是自己编号倍数的灯做相反处理。问当第 N 个人操作完之后,有哪些灯是关闭着的?

解法

首先,我们观察样例,会发现输出的数都是完全平方数,而且是 1 到 n 这个范围内的。简单证明一下为什么,因为只有完全平方数的因数个数为奇数,其余数都是偶数,而按动偶数次下也就相当于没按了,所以最后还是亮的(因为一开始灯也都是亮的),那么最后关着的灯就是这些编号为完全平方数的灯了。

我们只需一个循环输出 1 到 n 之间的完全平方数,整个代码时间复杂度只有

代码:

常规做法,,不会啊啊啊啊啊啊啊啊啊啊啊

 

posted @ 2024-04-18 16:31  一只特立独行的猪yuu  阅读(17)  评论(0编辑  收藏  举报