Python实现输入一个正整数X。现有X盏灯(熄灭),有X个人。让第一个人把所有1的倍数的灯改变状态(把开的关掉、把关的打开),让第二个人把所有2的倍数的灯改变状态,第三个人又执行第一个人的操作,第

该博客讨论了一个数学问题,即X个人轮流改变1到X编号的灯泡状态,最后哪些灯会亮着。文章通过编写Python代码来模拟这个过程,并展示了如何计算最终亮着的灯的编号。算法主要涉及数论和位运算,对于理解奇偶性和循环操作有很好的解释作用。

输入一个正整数X。现有X盏灯(熄灭),有X个人。让第一个人把所有1的倍数的灯改变状态(把开的关掉、把关的打开),让第二个人把所有2的倍数的灯改变状态,

第三个人又执行第一个人的操作,第四个人执行第二个人的操作以此类推,直到第X个人操作完毕。输出亮着的灯的编号,用空格隔开。

 

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=" ")

 输出结果

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值