Python 什么限制会导致此脚本卡住?

Python 什么限制会导致此脚本卡住?,python,Python,我在用python做一个数学拼图,你会发现数字的序列是k个数字,每个数字的乘积等于这些数字的和,即k=3 1*2*3=1+2+3 我对python和编程基本上是新手,我很好奇为什么会有一个“下降”,它可以非常快地计算到某个点,然后程序就卡住了 psnumbers = [] #this gives me a number to start a for loop later in the script def ones(n): string = '1'*n return int(s

我在用python做一个数学拼图,你会发现数字的序列是k个数字,每个数字的乘积等于这些数字的和,即k=3 1*2*3=1+2+3

我对python和编程基本上是新手,我很好奇为什么会有一个“下降”,它可以非常快地计算到某个点,然后程序就卡住了

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)

循环(n)的所有值,其中n是否确定在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>>11111111111111228

n=24>>111111111111112163473
在我达到jupy笔记本极限之前

我不确定你是否有时间让电脑来解决这个问题,比如说你可以每秒检查1000个数字,这需要你
10^24*10^-4=10^20秒
。。。或
1.15740741×1015天
。您可能需要做一些复杂的逻辑来避免两次检查相同的数字(对于您的算法,112==121)


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

对于任何给定的字符串长度,在找到单一解决方案后,您的代码将退出。碰巧,对于
n
到23的任何值,都有一个简单的解决方案

然而,当我们得到n=24时,所有前导的
1
s的开销最终会滑过小数值的各种数值性质,并且没有这样的解决方案

我更改了算法“查找所有此类数字”的指令,并在每个循环前后添加了一个简单的
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

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

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