带锁的门
在走廊上有n个带锁的门,从1到n依次编号。最初所有的门都是关着的。我们从门前经过n次,每次都从1号门开始。在第i次经过时(i = 1,2,…, n)我们改变i的整数倍号锁的状态;如果门是关的,就打开它;如果门是打开的,就关上它。在最后一次经过后,哪些门是打开的,哪些门是关上的?有多少打开的门?
猜测:最终是第 1 1 1号门与第 n 2 \frac{n}{2} 2n号门开着,下面通过代码根据计算机执行的结果进行验证
import numpy as np
def door_with_lock(n):
# 创造出n个带锁且关着的门,为了便于遍历,创造n+1个,关着为0,开启为1
doors = np.zeros(n + 1, dtype=int)
for count in range(1, n + 1):
for i in range(1, n + 1):
if i % count == 0: # 取余为0即为整数倍
if doors[i] == 1: doors[i] = 0
else: doors[i] = 1
open_list = []
for i in range(1, n + 1):
if doors[i] == 1:
open_list.append(i)
return '共{0}个门,其中处于开着状态的门的编号为{1}'.format(n, open_list)
print(door_with_lock(7))
print(door_with_lock(10))
print(door_with_lock(100))
print(door_with_lock(200))
共7个门,其中处于开着状态的门的编号为[1, 4]
共10个门,其中处于开着状态的门的编号为[1, 4, 9]
共100个门,其中处于开着状态的门的编号为[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
共200个门,其中处于开着状态的门的编号为[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196]
根据代码执行结果可知猜测是有错误的,最终根据代码结果得出开着的门的编号规律如下:
编号均为
k
2
k^2
k2,其中
k
k
k是一段连续的整数,且
1
⩽
k
2
⩽
n
1 \leqslant k^2 \leqslant n
1⩽k2⩽n