日常刷题10

题目:给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
(来源:力扣(LeetCode))
思路:(暂时不看进阶的说明)解决这道题的方法很简单,跟着题目的意思走,无非是用循环加递归实现 :将输入的数字一位一位相加,最后要是相加结果小于10,则直接返回;否则继续调用函数自身,直至递归出口。
代码:

 int addDigits(int num)
{
    int sum=0;
    if(num<10)
        return num;
    else
    {
        while(num!=0)
        {
            sum=sum+num%10;
            num=num/10;
        }
        return sum<10?sum:addDigits(sum);
    }
}

由于“进阶”的说明存在,那这题一定有比递归+循环更简单的方法。
不妨先写几个数看看:

运算前123456789
运算后123456789
运算前101112131415161718
运算后123456789
运算前192021222324252627
运算后123456789
……
以此类推。
不难发现,运算后的结果总是以1~9位一个循环,那自然会想到用模除求某一个数的运算结果是在这个循环中的哪一个个。于是,就可以写成:
int addDigits(int num)
{
    if(num%9==0&&num!=0)//单独处理取余结果为零时的情况
        return 9;
    else
        return num%9;
}

这个就是对于“进阶”说明的一个解法.在数学中,这个结果被称为“数根”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值