python - 按除数查找开关

标签 python python-3.x algorithm

有 N 个开关(从 1 到 N),还有 N 个灯泡(从 1 到 N)。

开关只能按一次,它可以打开/关闭灯泡。 一个开关可以打开/关闭 1 个以上的灯泡。

例如: 开关编号 12 可以打开/关闭灯泡 {1, 2, 3, 4, 6, 12} (因为 {1, 2, 3, 4, 6, 12} 是 12 的约数)

所以我们有一个函数 main(N,setON)

  • N是灯的数量
  • SetOn 是从一开始就打开的一组灯泡

该函数必须返回用于打开所有灯泡的开关列表

例如,N=6setON = {2,4},返回列表[2,5,6]

  • 按下按钮 2 后将点亮 {1,4} 灯泡
  • 按下按钮 5 后将点亮 {4,5} 灯泡
  • 按下按钮 6 后将点亮 {1,2,3,4,5,6} 灯泡

我开始提出这个问题,但我不知道如何解决这个问题。 我这样做的方式是调用一个函数 divisors 为每个数字找到除数,然后返回一个数字 N 的除数列表,然后我为每个列表运行一个循环以查看它在哪里打开或关闭并放置数字切换到新列表。 但是我实际上并没有得到我想要的结果,而且我没有想法。

我想在这里提出你的建议,我不是要求你解决我的问题,只是给我一个提示 :) 或者如果你想纠正我。

import math
def main(N, setON):
    newList= []
    acces = set(range(1,N+1))
    turnOFF = set()
    for number in range(N,1,-1):
        divs = divisors(number)                    
        for i in divs:
            if i in setON:
                turnOFF.add(i)
                setON.remove(i)
            else:
                setON.add(i)
                if i in turnOFF:
                    turnOFF.remove(i)
        newList.append(divs[-1])
        if len(setON) == N-1:
            print(newList)


def divisors(n):
    divs = [x for x in range(1, int(math.sqrt(n))+1) if n % x == 0]
    opps = [int(n/x) for x in divs]
    return list(set(divs + opps))


N=6
setON={2,4}
main(N, setON)

它给了我 [6, 5, 4]

最佳答案

从编号最高的开关开始,一直向下。

如果开关 X 是您可以切换的最高开关,那么它是唯一可以改变灯泡 X 的开关,因此请查看灯泡 X 以确定该开关是否必须打开或关闭。

然后确定开关 X - 如果它必须打开,则切换其除数的灯泡并继续到下一个最小的开关,因为现在那个是您可以更改的最高开关。

继续,直到你没有开关。要么所有灯泡都亮着,要么没有应答。

关于python - 按除数查找开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53010904/

相关文章:

python编码mysql :(

python - numpy.unique 保留顺序

java - 我将如何将字符串算法转换为实际代码?

python - Django 工厂男孩 : fill modelfield with choices throws error

python - 在保留注释的同时修改 python AST

python-3.x - 如何在不下载的情况下在 AWS S3 中列出 tar 中的文件?

python - Sentry - 清理局部变量敏感数据

python - GTK 对话框边距不起作用

java - 查找连续几天之间的温度差异

.net - 在深度优先搜索期间检测系谱图中的循环