You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成最大长度为n、所有数位严格递减的数字?

实现思路

所有数位严格递减的数字,本质是从0-9共10个数字中选k个不同数字(k取值范围为1到n),再按从大到小排序拼接而成,天然不会出现重复、数位相等的情况,覆盖所有符合要求的结果。

现有代码问题排查

  • 语法错误:func函数内部代码没有缩进,Python对缩进要求严格,会直接触发运行报错
  • 逻辑覆盖不全:初始arr仅存入了3位严格递减数,后续生成逻辑也仅在已有数字后拼接更小的数位,没有覆盖1位、2位的独立结果;循环终止条件k>1会漏掉末尾加1的情况,比如541这类结果无法生成
  • 计算错误:求百位、十位时用了普通除法/,Python3中/返回浮点数,后续取模运算会出现异常,应该用整数除法//
  • 输出格式错误:直接调用write没有加换行符,生成的内容会全部连在一起,无法识别单个数字

正确实现代码

基于组合库的简洁实现

from itertools import combinations

def generate_strict_decreasing(n, output_path="demo.txt"):
    res = []
    # 遍历所有可能的数字长度,从1到最大长度n
    for length in range(1, n+1):
        # 从0-9中选length个不同数字,combinations返回升序元组
        for digits in combinations(range(10), length):
            # 跳过前导为0的无效数字
            if digits[-1] == 0:
                continue
            # 反转元组得到降序排列,拼接为字符串
            num_str = ''.join(map(str, reversed(digits)))
            res.append(num_str)
    # 写入文件,每行一个结果
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write('\n'.join(res))
    return res

# 调用示例:生成最大长度为5的符合要求的数字
generate_strict_decreasing(5)

无第三方依赖的回溯实现

def backtrack(start, path, n, res):
    if path:
        res.append(''.join(map(str, path)))
    if len(path) == n:
        return
    # 下一位必须比当前最后一位小,从start-1向下遍历到0
    for num in range(start-1, -1, -1):
        path.append(num)
        backtrack(num, path, n, res)
        path.pop()

def generate_strict_decreasing(n, output_path="demo.txt"):
    res = []
    # 第一位从9到1,不能为0
    for first in range(9, 0, -1):
        backtrack(first, [first], n, res)
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write('\n'.join(res))
    return res

generate_strict_decreasing(5)

内容的提问来源于stack exchange,提问作者Yankee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:27:03