Python 如何找到给定数字的所有n位数字?

Python 如何找到给定数字的所有n位数字?,python,algorithm,math,Python,Algorithm,Math,我在寻找一种算法,它能够找到所有的数字,这些数字有n个数字长,它们的数字之和等于x。由于代码是大型程序的一部分,因此需要较低的时间复杂度 示例: findNumbers(2,5) [14,23,32,41,50] [9999999999] 下面的代码似乎可以找到所需的数字,但效率有点低。例如,FindNumber 5,5需要检查10000个数字,而只接受70个。当n值较高时,这种不匹配使其速度非常慢 什么是更快的方法 def firstNumbern,x: 查找第一个n位数,其中x为位数之和

我在寻找一种算法,它能够找到所有的数字,这些数字有n个数字长,它们的数字之和等于x。由于代码是大型程序的一部分,因此需要较低的时间复杂度

示例:

findNumbers(2,5)
[14,23,32,41,50]

[9999999999]

下面的代码似乎可以找到所需的数字,但效率有点低。例如,FindNumber 5,5需要检查10000个数字,而只接受70个。当n值较高时,这种不匹配使其速度非常慢

什么是更快的方法

def firstNumbern,x: 查找第一个n位数,其中x为位数之和 num9=x-1//9所述第一个数字末尾需要的9个数字 f=10**n-1如果已经有n-1个9,则第一个数字应为1或更高 f+=10**num9-1 num9九 f+=10**num9*x-1-9*num9在9之前加上其余的 返回f def sumOfDigitsx: s=0 当x>0时: s+=x%10 x/=10 返回s def findNumbersn,x,allow_all=False: f=第一个数字,x nums=[] 当f<10**n时: 如果allow_all或sumOfDigitsf==x: 阿佩德夫夫人 f+=9如果数字之和为x,则所有数字必须等于模9 返回nums FindNumber 3,5[104,113,122,131,140,203,212,221,230,302,311,320,401,410500]
以下代码查找所有所需的数字。在中的_组中有一个参数max _,您希望以10为基数以外的其他基数运行

代码首先创建一个num_数字值列表。列表中的每个条目代表一位数字。为了使代码更通用,可以设置最大数字。十进制是9,八角形是7。如果把3位小数加在一起,甚至是999。现在打印的内容都是十进制的,但是可以很容易地适应大于10的基数

此数组a不一定需要所有数字都小于10。第一步将最后一个数字的溢出重新分配给前面的数字。当溢出需要一个额外的数字时,代码现在停止

在步骤2中,寻找继任者。如果没有溢出,倒数第二位只需加1。这将为数字创建一个盈余,该盈余应再次从最后一个数字中减去。当倒数第二位数字增长过大时,它已经是9,需要将其设置为0,并且前面的数字应该递增,以此类推

在第三步中,最后一位数字需要用盈余进行调整。这可能会导致溢出,这将在步骤1中处理

要获得以零开始的数字,可以用[0,…,0,所需的_和]初始化a。要仅获取以1或更高开头的数字,应使用[1,0,…,0,所需的_sum-1]初始化a

请注意,由于Python没有do。。。而不是重复。。。在像C语言这样的构造之前,这些循环需要使用while True和break来编写

def find_NUNBERSUM_数字、所需总和、最大迭代次数=100、最大输入位数=9: a=[0表示rangenum\u位中的i] a[0]=所需的_和-1 a[num_digits-1]=1 找到的所有数字=假 虽然未找到所有\u编号且最大\u迭代次数>0: 步骤1:当[0]太大时:向左重新分发 i=0 而[i]>max\u in\u位: 如果i==num_位-1: 找到的所有数字=真 打破 a[i+1]+=a[i]-max\u in\u位 a[i]=最大单位位数 i+=1 如果找到所有\u编号\u: 打破 num=sum10**i*a[i]表示枚举a中的i,n printf{num:}printa[:-1] 步骤2:在组已满的情况下向倒数第二个组添加一个:设置为0并递增 左组; 当[0]太小导致盈余太大时,重复递增 i0=1 盈余=0 虽然正确:至少需要执行一次,如果盈余过大,则重复执行 i=i0 为True时:将a[i]增加1,可以向左进位 如果i==lena: 找到的所有数字=真 打破 其他: 如果a[i]==max\u in\u位: a[i]=0 剩余-=最大值(单位:位数) i+=1 其他: a[i]+=1 盈余+=1 打破 如果找到所有\u编号\u: 打破 如果[0]>=盈余: 打破 其他: 盈余-=a[i0] a[i0]=0 i0+=1 步骤3:a[0]应该吸收步骤1中创建的盈余,尽管a[0]可能会越界 [0]=盈余 盈余=0 最大迭代次数-=1 找到2号,5号 找修女 10,90 找到20号,90号
请注意,有2785022004925340460个20位数字和90位数字,因此无法将它们全部输出。

您的代码在哪里?到目前为止你试过什么?我的东西太乱了,所以我决定不把它放在这里。它会返回奇怪的结果,并且无法完成它的工作。你关心时间复杂性吗?是的,我关心,因为这将是更大的算法的一部分,所以我需要快速执行。@Mesalcode听起来你好像在试图为你的作业找到解决方案。Stackoverflow不适合这样做。如果你有具体的问题,你应该提供我知道我不应该在评论感谢,但这个解决方案是非常好的。非常感谢。你能用语言解释一下你的代码在做什么吗?
findNumbers(10,90)