Python递归表达式解析:求数位相乘至个位数的次数问题
理解数字各位相乘至个位数的次数计算原理及实现
嘿,这个问题我之前也碰到过,本质就是反复计算数字各位的乘积,直到得到个位数,然后统计这个过程的操作次数对吧?我来一步步给你拆解清楚:
核心原理
先把规则掰碎了说:
- 如果输入的数本身就是个位数(1-9),直接返回0次——因为根本不需要任何操作
- 要是数是两位数及以上,就把它的每一位数字拆出来相乘,得到一个新数,这算1次操作
- 重复上面的步骤,直到新数变成个位数,最后把累计的操作次数返回就行
举两个题目里的例子再理一遍:
示例1:f(29) → 2
第一步:29=18(操作次数+1,现在是1)
第二步:18=8(操作次数+1,现在是2),8是个位数,停止返回2
示例2:f(777) →4
第一步:777=343(次数1)
第二步:343=36(次数2)
第三步:36=18(次数3)
第四步:18=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
相关产品推荐
相关产品推荐

