[258] Add Digits

1. 题目描述

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.

For example:
Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it.

Follow up:
Could you do it without any loop/recursion in O(1) runtime?
题目叙述为给定一个非负整型,将其拆分为单个数字不停地进行加法,直到最终结果为一个1-9的数字为止。主要难点在题目要求不能使用递归和循环,相应的我们需要找到数字和结果之间的对应关系。

2. 解题思路

这里需要引入一个数字根的概念,题目中给出的计算方法其实就是求解数字根的方法,而求解数字根已经有现成的公式

       -- 0 (n=0)
       |  
dr(n)=--- 9 (n=9的倍数)
       |
       -- n%9 (n≠9的倍数)dr(0) = 0
dr(n) = (n-1)%9 + 1

根据上面的公式,很容易能不使用递归和循环计算一个数字的数根。
那么为什么会有这样的公式呢,原因就是任意一个数字加(减)9后(>0)他的数根保持不变。
举个例子,一个数字加9有两种情况:
①产生进位
产生进位即尾数>=1的情况,当一个数字加9后他的十位数会加1,个位数会减1,那么数根保持不变,如124+9=1(2+1)(4-1)=133,92+9=(9+1)(2-1)=101
②不产生进位
不产生进位即尾数==0的情况,当一个数字加9后相当于在他的数根上加9,又变成了在一个数字上加上9数根不变的问题。
所以我们得到一个数字只要对他取9的余数即可,下面给出实现代码。

3. Code

class Solution {
public:
    int addDigits(int num) {
        if(num == 0)
            return 0;
        return (num-1)%9+1;  // 避免9%9=0的情况
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值