jerryxjr1220 发表于 2017-1-26 16:21:52

python解一道有趣的智力题(开箱子)

过年在家闲来无事就看看有什么好玩的智力题,看到这样一道题目:开箱子。

题目:
走廊上有100个关上的储物柜。有个人先是将100个柜子全都打开。接着,每数两个柜子关上一个。
然后,在第三轮时,再每隔两个就切换第三个柜子的开关状态(也就是将关上的柜子打开,将打开的关上)。
照此规律反复操作100次,在第i轮,这个人会每数i个就切换第i个柜子的状态。
当第100轮经过走廊时,只切换第100个柜子的开关状态,此时有几个柜子是开着的?分别是哪几个箱子?

这题据说是微软的面试题,你会解么?

用python写程序的话,20行代码都不用,大家先动动脑筋,我的解答公布在下面。

源代码:
**** Hidden Message *****

五行缺五行 发表于 2017-1-26 21:05:29

牛逼

yun. 发表于 2017-1-27 19:30:52

{:5_106:}

小Q学Python 发表于 2017-1-29 10:48:49

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

wjf_V 发表于 2017-1-29 12:16:49

感谢群主

panda小正太 发表于 2017-1-29 14:58:15

楼主厉害!

Hughues 发表于 2017-1-29 21:15:39

牛人

冬雪雪冬 发表于 2017-1-29 21:29:19

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

易水寒楠 发表于 2017-1-29 23:06:17

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

Craigyu 发表于 2017-1-30 15:28:27

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:24:29

本帖最后由 余欲渔 于 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:25:09

本帖最后由 余欲渔 于 2017-2-8 17:29 编辑

看很多鱼油用了列表。就是能否被整除的问题,能整除就是会碰到,不能整除就碰不到,每次碰到箱子的状态就变动一次

mhp0114 发表于 2017-2-8 18:31:19

谢谢楼主分享,难度一般应该。

Qking 发表于 2017-2-9 00:58:50

厉害

Jonin616 发表于 2017-2-10 16:06:58

本帖最后由 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))

jay6697117 发表于 2017-2-17 18:18:14

{:10_256:}haha

chenggeer 发表于 2017-2-20 08:13:04

看看

yay 发表于 2017-2-21 21:20:16

学习

marmot 发表于 2017-2-21 21:45:59

4 9 16 25 36 49 64 81 100

yay 发表于 2017-2-22 17:07:14

余欲渔 发表于 2017-2-8 17:24
不知道解的对不对

运行结果正确,代码看不懂。。。
页: [1] 2 3 4
查看完整版本: python解一道有趣的智力题(开箱子)