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

首先来看这道题

用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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值