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的情况
}
};