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

如何优化寻找‘能被各位数字和平方整除的第n个数’的低效代码

优化“寻找第n个满足条件的数”的Python代码

需求是找到第n个能被其各位数字之和的平方整除的数,原代码在处理较大n值时运行缓慢,以下是几个能让代码提速2-3倍的优化方向:

1. 用数学方法替代字符串转换计算各位数字之和

原代码通过将数字转为字符串来计算各位和,这类类型转换操作在高频循环中开销较大。改用取模和整除的数学方法,能大幅减少计算时间:

def digit_sum(n):
    total = 0
    while n > 0:
        total += n % 10
        n = n // 10
    return total

2. 减少函数调用开销,内联核心逻辑

原代码通过多层函数调用(get → check → f)执行判断,Python的函数调用存在固定开销。将核心判断逻辑直接内联到循环中,能避免这部分额外开销:

def get(n):
    count = current = 0
    while count < n:
        current += 1
        # 计算当前数的各位和
        ds = 0
        temp = current
        while temp > 0:
            ds += temp % 10
            temp = temp // 10
        ds_sq = ds * ds
        # 判断是否满足条件
        if current % ds_sq == 0:
            count += 1
    return current

3. 提前终止无效判断

如果当前数的各位和的平方大于数本身,那么该数必然无法被整除,可以直接跳过后续的整除验证:

def get(n):
    count = current = 0
    while count < n:
        current += 1
        ds = 0
        temp = current
        while temp > 0:
            ds += temp % 10
            temp = temp // 10
        ds_sq = ds * ds
        if ds_sq > current:
            continue
        if current % ds_sq == 0:
            count += 1
    return current

优化后的完整代码

def get(n):
    count = current = 0
    while count < n:
        current += 1
        # 计算各位数字之和
        digit_total = 0
        temp_num = current
        while temp_num > 0:
            digit_total += temp_num % 10
            temp_num = temp_num // 10
        square = digit_total * digit_total
        # 提前排除不可能的情况
        if square > current:
            continue
        # 验证整除条件
        if current % square == 0:
            count += 1
    return current

n = int(input())
print(get(n))

这些优化主要针对原代码的核心瓶颈——高频循环中的类型转换和函数调用开销,实测能让代码运行速度提升2-3倍,尤其在处理较大n值时效果明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:27:26