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

Python递归表达式解析:求数位相乘至个位数的次数问题

理解数字各位相乘至个位数的次数计算原理及实现

嘿,这个问题我之前也碰到过,本质就是反复计算数字各位的乘积,直到得到个位数,然后统计这个过程的操作次数对吧?我来一步步给你拆解清楚:

核心原理

先把规则掰碎了说:

  • 如果输入的数本身就是个位数(1-9),直接返回0次——因为根本不需要任何操作
  • 要是数是两位数及以上,就把它的每一位数字拆出来相乘,得到一个新数,这算1次操作
  • 重复上面的步骤,直到新数变成个位数,最后把累计的操作次数返回就行

举两个题目里的例子再理一遍:

示例1:f(29) → 2
第一步:29=18(操作次数+1,现在是1)
第二步:1
8=8(操作次数+1,现在是2),8是个位数,停止返回2

示例2:f(777) →4
第一步:777=343(次数1)
第二步:343=36(次数2)
第三步:36=18(次数3)
第四步:1
8=8(次数4),返回4

两种实现方式(以Python为例)

我给你写两种常用的实现思路,循环和递归,各有各的好处,你可以根据场景选:

循环实现(更稳妥,避免栈溢出)

循环的逻辑很直观,适合处理非常大的数字,不会出现递归深度不够的问题:

def f(n):
    count = 0
    # 只要数字不是个位数,就继续循环
    while n >= 10:
        product = 1
        # 拆解每一位数字相乘
        temp = n
        while temp > 0:
            product *= temp % 10
            temp = temp // 10
        n = product
        count += 1
    return count

简单解释下代码:

  • 用count变量记录操作次数,初始为0
  • 外层循环判断当前数是否是个位数,不是就继续处理
  • 内层循环把当前数的每一位拆出来(temp%10取最后一位,temp//10去掉最后一位),相乘得到新的乘积
  • 更新当前数为这个乘积,次数加1,直到当前数变成个位数,返回次数

递归实现(代码更简洁,逻辑清晰)

递归写法更“优雅”,适合快速理解逻辑,小数字场景下用着很舒服:

def f(n):
    # 基线条件:如果是个位数,直接返回0次
    if n < 10:
        return 0
    # 计算当前数各位的乘积
    product = 1
    temp = n
    while temp > 0:
        product *= temp % 10
        temp = temp // 10
    # 递归处理乘积,次数加1(因为这次相乘算一次操作)
    return 1 + f(product)

这段代码的核心是:

  • 先判断是不是个位数,是的话直接返回0
  • 否则算出各位乘积,然后递归调用函数处理这个乘积,同时把次数加1(因为这次相乘已经完成了一次操作)

测试验证

用题目里的示例测试下:

  • f(29) → 2,正确
  • f(777) →4,正确
  • f(5) →0,正确

再测几个边界情况:

  • f(10) →1(1*0=0,0是个位数,一次操作就搞定)
  • f(999) →4(999=729 →729=126 →126=12 →1*2=2,总共4次操作)

小提醒

  • 要是数字里包含0,比如10、20这类,相乘后直接得到0,一次操作就结束了,这点代码已经自动处理了
  • 题目说输入是正整数,所以不用考虑0或者负数的情况哦

内容的提问来源于stack exchange,提问作者P. Prunesquallor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:41:20