我的代码怎么了?是给储物柜的泡泡

2024-06-16 11:01:25 发布

您现在位置:Python中文网/ 问答频道 /正文

def change(item):
    if (item == True):
        return False
    return True
def locker_puzzle(x):
    lockers = [False]*x
    num_students = 100
    num_lockers = 100
    for i in range(1, x+1):
        for j in range(j, x+1):
            if(j % i == 0):
                lockers[i-1] = change(lockers[i-1])
    count = 1
    for item in lockers:
        if (item == True):
            print(count)
        count = count+1
def main():
    locker_puzzle(100)
main()

输出应为:

^{pr2}$

解决“储物柜之谜”。一所学校有100名学生和100个储物柜。开学第一天所有的储物柜都关闭了。当学生进入时,第一个学生(S1)打开每个储物柜。然后第二个学生(S2)从第二个储物柜(L2)开始,并每隔一个储物柜关闭一次。学生S3从第三个储物柜(L3)开始,每隔三个储物柜更换一次(打开时关闭,关闭时打开)。学生S4从储物柜L4开始,每隔四个储物柜更换一次。学生S5从储物柜L5开始,每隔五个储物柜更换一次,以此类推,直到学生S100更换L100。在


Tags: infalsetrueforreturnifdefcount
3条回答

我想你错了for j in range(j, x+1):
您应该将j替换为i。在

更简单的解决方案是:

def locker_puzzle(x): 
    lockers = [False] * x
    for i in range(1, x + 1):
        for j in range(i, x + 1, i):
            try:
                lockers[j-1] = not lockers[j-1]
            except IndexError as e:
                print(i, j)
                raise e
    for i, locker in enumerate(lockers):
        if locker:
            print(i+1)

我就是这样解决的。在

使用更好的名称会使错误更加明显:

def locker_puzzle(num_lockers):
    lockers = [False]*num_lockers 

    for stud in range(1, num_lockers+1):
        for lock in range(stud, num_lockers+1,stud):  # you went wrong here
            lockers[lock-1] = not lockers[lock-1]  

    return lockers

def main():
    for i,v in enumerate(locker_puzzle(100)):
        if v:
            print(i+1)

main()

输出:

^{pr2}$
def locker_puzzle(n):
    lockers = [False] * n
    for s in range(n):
        for l in range(s, n, s + 1):
            lockers[l] = not lockers[l]
    return lockers
for i, locker in enumerate(locker_puzzle(100), 1):
    if locker:
        print(i)

该输出:

^{pr2}$

相关问题 更多 >