编号灯泡依次开关切换问题

本文通过两道编程题介绍了Python中判断数的特性以及解决复杂逻辑问题的方法。第一题涉及Python语法错误,解释了为何不能使用`num++`并展示了修复后的代码。第二题则是一个灯泡开关问题,通过逻辑分析得出正确解决方案,并用代码实现。最后提供了一个完整代码示例,用于模拟百盏灯经过特定步骤后的亮灯数量。
摘要由CSDN通过智能技术生成

首先来看这道题

用Python输出1~1000中不能被2,5,7整除的数的个数

错误代码和提示:

num=0
for i in range(1,1001):
    if i%2!=0 and i%5!=0 and i%7!=0 :num++
print(num)
  File "<ipython-input-52-51f03998991e>", line 3
    if i%2!=0 and i%5!=0 and i%7!=0 :num++
                                          ^
SyntaxError: invalid syntax

正确代码:

num=0
for i in range(1,1001):
    if i%2!=0 and i%5!=0 and i%7!=0:#注意冒号必须写,if后可以不写括号,一行其实不换行缩进也可以
     	num=num+1#注意Python中不能使用num++
print(num)

为什么Python中不能使用num++呢?
后来的num还是原来那个对象吗?不是
验证代码:

num=0
print(id(num))
for i in range(1,1001):
    if i%2!=0 and i%5!=0 and i%7!=0:
        num=num+1
print(id(num))
print(num)
140715082555760
1858682797296#地址已经不同了
343

原题

跟上一道题目不同,依次切换后,后面的会按亮一些前面暗灭的灯。
暴力解法:
思路:切换整除2的灯后,亮着的灯是不能被2整除的,暗着的是能被2整除的;切换整除5的灯,这个步骤会暗灭不能被2整除能被5整除的数,会按亮能被2又能被5整除的数,此时亮着的灯为有2,5公约数的灯和不能被2、5整除的灯,剩余情况即是暗着的灯;切换整除7的灯,这个步骤会暗灭有2,5,7公约数和不能被2、5整除但能被7整除的灯,会按亮能被2,7整除不能被5整除的灯和能被5,7整除不能被2整除的灯,此时亮着的灯就是能被2,7整除不能被5整除能被5,7整除不能被2整除和能被2,5整除不能被7整除和不能被2,5,7整除的灯。总结起来就是亮着灯就是能被且只能被两个数整除和都不能被整除的灯。接下来就能写代码了

num=0
for i in range(1,1001):
    if ((i%2==0)+(i%5==0)+(i%7==0))==2:
        num=num+1
    if(i%2!=0 and i%5!=0 and i%7!=0):
        num=num+1
print(num)

这个思路听着很复杂,但是只要遵循着这个步骤亮着的灯为这个步骤按亮的灯和上一个步骤亮着到现在也没被按灭的灯,再多的步骤肯定是能推导出来的,就是很浪费精力还容易出错。

接下来整个过程用代码实现,首先应该创建一个值都是0或1的1000长度的数组。

代码如下:

L=[True]*1000#设初始状态true都是亮的
#怎么将下标0转换为1讨论,同理其它下标
c=0
for i in range(0,1000):
    if (i+1)%2:L[i]=not L[i]
for i in range(0,1000):
    if (i+1)%5:L[i]=not L[i]
for i in range(0,1000):
    if (i+1)%7:L[i]=not L[i]
for t in L:
    if t==True:c=c+1
print(c)
500

大功告成

百度百盏灯百步切换面试题

题目:第n次切换被n整除的灯。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二维数组灯泡开关问题是一个关于矩阵中灯泡状态改变和查询的问题。给定一个n*m的矩阵,矩阵中有一些灯泡,这些灯泡连成了k条互不重叠的链。每个灯泡都有一定的权值w,但只有当灯泡打开时才会产生贡献。有两种操作:①Switch i——表示将编号为i的链所有的灯泡取反(即开变关,关变开)。②Ask x1,y1,x2,y2——表示询问以(x1,y1)和(x2,y2)为两个端点的子矩形所产生的贡献。 根据引用\[2\]的解释,这个问题不适合使用递推的方法解决,因为状态改变会涉及到整个行和列,无法直接递推。而根据引用\[3\]的解释,数据范围较小,可以使用暴力枚举的方法解决。具体来说,我们可以枚举所有的开关状态,共有2^(n*m)种情况,然后判断每种情况下是否能将整个灯泡亮起来。 因此,对于这个问题,可以使用暴力枚举的方法来解决。 #### 引用[.reference_title] - *1* [codeforces 707E Garlands (离线、二维树状数组)](https://blog.csdn.net/dieyi9889/article/details/101867233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[枚举] aw116. 飞行员兄弟(二维递推+开关问题+二进制枚举)](https://blog.csdn.net/yl_puyu/article/details/119068619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值