1.题目描述:
假设有 N 蓋灯 (N 为不大于 5000 的正整数),从1到 N 按顺序依次编号,初始时全部处于开启状态;第一个人(1 号)将灯全部关闭,第二个人(2 号)将编号为2的倍数的灯打开,第三个人(3 号)将编号为3的倍数的灯做相反处理(即,将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。问当第 个人操作完之后,有哪些灯是关闭着的?
2.输入格式
输入为一行,一个整数 N,为灯的数量。
3.输出格式
输出为一行,按顺序输出关着的灯的编号。编号与编号之间间隔一个空格。
4.输入输出样例
输入1:
10
输出1:
1 4 9
输入2:
5
输出2:
1 4
6.C语言方式代码:
#include <stdio.h>
int main() {
int N;
scanf("%d", &N); // 输入灯的数量
// 创建一个数组来表示灯的状态,1表示开启,0表示关闭
int lights[N + 1]; // 从1到N,所以大小为N+1
for (int i = 1; i <= N; i++) {
lights[i] = 1; // 初始时全部开启
}
// 模拟每个人操作灯的过程
for (int person = 1; person <= N; person++) {
for (int light = person; light <= N; light += person) {
lights[light] = !lights[light]; // 反转灯的状态
}
}
// 输出关闭的灯的编号
for (int i = 1; i <= N; i++) {
if (lights[i] == 0) { // 如果灯是关闭状态
printf("%d ", i);
}
}
return 0;
}
7.C++方式代码:
#include <iostream>
#include <vector>
int main() {
int N;
std::cin >> N; // 输入灯的数量
// 创建一个数组来表示灯的状态,1表示开启,0表示关闭
std::vector<bool> lights(N + 1, true); // 从1到N,所以大小为N+1,初始时全部开启
// 模拟每个人操作灯的过程
for (int person = 1; person <= N; ++person) {
for (int light = person; light <= N; light += person) {
lights[light] = !lights[light]; // 反转灯的状态
}
}
// 输出关闭的灯的编号
for (int i = 1; i <= N; ++i) {
if (!lights[i]) { // 如果灯是关闭状态
std::cout << i << " ";
}
}
return 0;
}
8.Python3方式编写:
def main():
N = int(input()) # 输入灯的数量
# 创建一个列表来表示灯的状态,True 表示开启,False 表示关闭
lights = [True] * (N + 1) # 从 1 到 N,所以大小为 N+1,初始时全部开启
# 模拟每个人操作灯的过程
for person in range(1, N + 1):
for light in range(person, N + 1, person):
lights[light] = not lights[light] # 反转灯的状态
# 输出关闭的灯的编号
closed_lights = [i for i in range(1, N + 1) if not lights[i]] # 找出关闭的灯
print(" ".join(map(str, closed_lights))) # 按要求输出
if __name__ == "__main__":
main()