python解一道有趣的智力题(开箱子)
过年在家闲来无事就看看有什么好玩的智力题,看到这样一道题目:开箱子。题目:
走廊上有100个关上的储物柜。有个人先是将100个柜子全都打开。接着,每数两个柜子关上一个。
然后,在第三轮时,再每隔两个就切换第三个柜子的开关状态(也就是将关上的柜子打开,将打开的关上)。
照此规律反复操作100次,在第i轮,这个人会每数i个就切换第i个柜子的状态。
当第100轮经过走廊时,只切换第100个柜子的开关状态,此时有几个柜子是开着的?分别是哪几个箱子?
这题据说是微软的面试题,你会解么?
用python写程序的话,20行代码都不用,大家先动动脑筋,我的解答公布在下面。
源代码:
**** Hidden Message ***** 牛逼 {:5_106:} a = []
n = 100
for i in range(n):
a.append(False)
for i in range(1, n+1):
for j in range(0, n, i):
a = not a
for i in range(n):
if a:
print(i, end=' ')
1 4 9 16 25 36 49 64 81 感谢群主 楼主厉害! 牛人 boxes =
for i in range(1, 101):
for j in range(i - 1, 100, i):
boxes = not boxes
for n, i in enumerate(boxes):
if i:
print('Box %d is open'%(n + 1))
print('Total %d boxes are open'%boxes.count(True)) from collections import OrderedDict
box=OrderedDict()
box=box.fromkeys(range(1,101),1)
for k in box.keys():
if k%2==0 and k>=2:
box=0
for i in range(3,101):
for k in box.keys():
if k>=i and k%i==0:
if box==1:
box=0
else:
box=1
for k,v in box.items():
if v==1:
print(k,end=' ') box = [-1] * 100
for i in range(1,101):
for n in range(1, 101):
if (i * n - 1) < 100:
box = -box
else:
break
for i in range(100):
if box == 1:
print('第',i+1,'个箱子是打开的')
c = box.count(1)
print('共有', c, '个箱子打开') 本帖最后由 余欲渔 于 2017-2-8 17:27 编辑
不知道解的对不对
for i in range(1,101):
k=0
for j in range(1,i+1):
if i%j==0:
k+=1
if k%2==1:
print('第',i,'个箱子是开着的')
第 1 个箱子是开着的
第 4 个箱子是开着的
第 9 个箱子是开着的
第 16 个箱子是开着的
第 25 个箱子是开着的
第 36 个箱子是开着的
第 49 个箱子是开着的
第 64 个箱子是开着的
第 81 个箱子是开着的
第 100 个箱子是开着的 本帖最后由 余欲渔 于 2017-2-8 17:29 编辑
看很多鱼油用了列表。就是能否被整除的问题,能整除就是会碰到,不能整除就碰不到,每次碰到箱子的状态就变动一次 谢谢楼主分享,难度一般应该。 厉害 本帖最后由 Jonin616 于 2017-2-10 19:20 编辑
#20170210 开100个柜子
def xbox():
xbox = * 100
for turn in range(0,100):
swithSnum = 100 // (turn + 1)
i = 1
while i <= swithSnum:
if xbox[(turn + 1) * i - 1] :
xbox[(turn + 1) * i - 1] = 0
else:
xbox[(turn + 1) * i - 1] = 1
i += 1
for each in xbox:
if each:
print('第%d个盒子是开的' % (num + 1)) {:10_256:}haha 看看 学习 4 9 16 25 36 49 64 81 100 余欲渔 发表于 2017-2-8 17:24
不知道解的对不对
运行结果正确,代码看不懂。。。