开关问题python求解

输入一个正整数X。现有X盏灯(熄灭),有X个人。让第一个人把所有1的倍数的灯改变状态(把开的关掉、把关的打开),让第二个人把所有2的倍数的灯改变状态,以此类推,直到第X个人操作完毕。输出亮着的灯的编号,用空格隔开。
输入

一个正整数X
输出

所所有亮着的灯的编号,用空格隔开

效果图如下:

img

img

# 打开灯,关闭灯,最后还亮着哪些灯
# 输入一个正整数X。现有X盏灯(熄灭),有X个人。让第一个人把所有1的倍数的灯改变状态(把开的关掉、把关的打开),让第二个人把所有2的倍数的灯改变状态,以此类推,直到第X个人操作完毕。输出亮着的灯的编号,用空格隔开。
# 输入
# 一个正整数X
# 输出
# 所所有亮着的灯的编号,用空格隔开

import numpy as np

x = eval(input())
light = np.zeros(x) > 0

# 初始化人,及灯的状态均为关闭
print(x)
print(light)

# 遍历人
for i in np.arange(x + 1):
    if (i == 0): continue
    light = [not on if ((light_index + 1) % i == 0) else on for light_index, on in enumerate(light)]
    print(str(i), light)

print('开着的灯的编号有:')
for i, flag in enumerate(light):
    if (flag):
        print(i + 1, end=" ")



def changeLight(dict,y):
    dict2 = dict.copy()
    for key,val in dict.items():
        index = int(key)
        if y % 1 == 0 and  y % 2 != 0:
            if index % 1 == 0:
                dict2[str(index)] = not val            
        elif y % 2 == 0:
            if int(key) % 2 == 0:
                dict2[str(index)] = not val
    return dict2


num =  input('请输入一个正整数:\n')
x = int(num)
dict1  = {}; #初始化灯的状态
for i in range(1,x+1):
    dict1[str(i)] = False
for i in range(1,x+1): #执行开灯关灯的操作
    dict1 = changeLight(dict1,i)
    print(dict1)

print("所有亮着的灯是:",end='')
for key,value in dict1.items():
    if(value == True):
        print(key,end=" ")

img