首先来看这道题
用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整除的灯。