求一个数字的数根

题目

实现一个算法求一个数字的树根。介绍如下:

  • 将一正整数的各个位数相加(即横向相加)后,若加完后的值大于等于10的话,则继续将各位数进行横向相加直到其值小于10为止所得到的数,即为数根。
  • 例如对于数字 138,有 1+3+8=12,1+2=3,则 138 的数根为 3。

要求

  • Solution 中的 add_digits 方法用于求一个数字的数根。
  • add_digits 函数的参数 val 用于指定传入的数字。
  • add_digits 函数需要返回找到的数根。
  • 如果传入的 val 为 None,需要使用 raise 语句显示 TypeError。
  • 如果传入的 val 为负数,需要使用 raise 语句显示 ValueError。

代码实现

class Solution(object):

    def add_digits(self, val):
        if val is None:
            raise TypeError("请传入一个正整数")
        if val < 0:
            raise ValueError("请传入一个正整数")            
        while val >= 10:
            val = self._sum_cross(val)
        return val

    def _sum_cross(self, val):
        tmp = 0
        for i in str(val):
            tmp += int(i)
        return tmp

改写成递归思路

class Solution(object):

    def add_digits(self, val):
        if val is None:
            raise TypeError("请传入一个正整数")
        if val < 0:
            raise ValueError("请传入一个正整数")
        if val >= 10:
            tmp = 0
            for i in str(val):
                tmp += int(i)
            return self.add_digits(tmp)
        return val

参考

题目来源于实验楼在线,思路和解答为我自己编写的。
如有侵权,请联系我删除,邮箱:zheng_zhouxia@qq.com
水平有限,有不当之处烦请批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值