【问题标题】:what limits would cause this script to get stuck?什么限制会导致这个脚本卡住?
【发布时间】:2019-10-02 00:22:00
【问题描述】:

我正在使用 python 做一个数学难题,在这里你可以找到 k 位长的数字序列,其中每个数字的乘积等于数字之和,即 k=3 1*2*3 = 1 +2+3

我是 python 和一般编程的新手,我很好奇为什么会有一个“下降”,它可以非常快地评估到某个点,然后程序就会卡住。

p>
psnumbers = []

#this gives me a number to start a for loop later in the script
def ones(n):
    string = '1'*n
    return int(string)

#multiplies and adds the digits together and compares the values
def check(n):
    global psnumbers
    add = 0
    mult = 1
    for i in range(len(n)):
        add += int(n[i])
        mult*= int(n[i])
    if add == mult and n[0] != 0:
        print(n)
        psnumbers.append(n)
        return True
    else:
        return False

#starts checking numbers, starting with the value from ones()      
def loop(n):
    for x in range(2,n+1):
        for i in range(ones(x),ones(x)*2):
            if check(str(i)) == True:
                break
            else:
                continue

#loop(23) works for me fine, but loop(n) where n>=24 doesn't finish processing      
loop(23)

loop(n) 的所有值,其中 n

【问题讨论】:

  • 据我所知,该属性没有 24 位数字。你只需要检查

标签: python


【解决方案1】:

您确定在 n=24 处有解决方案吗?我认为您的代码按预期工作,只需要很长时间才能得出正确的答案。 我改变了你的循环,所以我只在 n=24 处寻找解决方案并打印出它正在尝试的数字......这将允许你在命令行上运行它并打印出它正在尝试的数字,你可以看出为什么需要这么长时间。

def loop(n):
    x = n
    for i in range(ones(x),ones(x)*2):
        print('\r' + str(i), end='')
        if check(str(i)) == True:
            break
        else:
                continue
    print('done')

这是一个明显更高的数字。

n=23 >> 11111111111111111111228

n=24 >> 111111111111111112163473 在我达到 jupy 笔记本限制之前。

我不确定您是否有时间让计算机解决它说您可以每秒检查 1000 个数字,这将需要您 10^24 * 10^-4 = 10^20 seconds... 或 1.15740741 × 1015 days。您可能会做一些棘手的逻辑来避免两次检查相同的数字(算法为 112 == 121)。

您的问题“为什么需要更长的时间”的答案是,n=24 比 n=23 离您的起点更远。

【讨论】:

    【解决方案2】:

    在找到任何给定字符串长度的单一解决方案后,您的代码将退出。碰巧的是,有一个简单的解决方案可以方便地处理 n 到 23 的任何值。

    但是,当我们达到 n=24 时,所有领先的 1s 的开销最终都滑过了小数的各种数值属性,并且没有这样的解决方案。

    我更改了您算法的检测方法,找到所有个这样的数字,并在每个循环之前和之后添加了一个简单的 time() 调用。

    def loop(n):
        for x in range(2,n+1):
            start = time()
            for i in range(ones(x),ones(x)*2):
                check(str(i))
            print(x, time() - start)
    

    n 的前几个值的计时是

    n     time (sec)
    2 0.00010895729064941406
    3 0.0007987022399902344
    4 0.008989572525024414
    5 0.08109426498413086
    6 0.6398007869720459
    7 6.47220778465271
    8 70.14981818199158
    

    如果您编写代码以仅处理非递减序列(数字按数字顺序排序)并进行检查以确保乘积在总和范围内,则可以大大加快这一速度。

    【讨论】:

      猜你喜欢
      • 2019-11-23
      • 2021-06-01
      • 2012-10-11
      • 1970-01-01
      • 2010-12-09
      • 2010-09-16
      • 2013-05-21
      • 1970-01-01
      • 2012-09-27
      相关资源
      最近更新 更多