题目
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?
思路
- 题目要求的是求某一非负整数的数根(Digital root),可利用公式
dr(n)=(n-1)%9+1 (n>0)
-
12345 = 1(9999+1) + 2(999+1) + 3(99+1) + 4(9+1) + 51
12345 = (19999) + (2999) + (399) + (49) + (1+2+3+4+5) = 9n + (1+2+3+4+5)
dr(12345) = dr(1+2+3+4+5) = dr((9n) + (1+2+3+4+5))
dr(y) = dr(9n + x) = dr(x) && y = 9n + x
if x < 10: dr(x) = x => dr(y) = dr(9n+x) = dr(x) = x = y % 9
一个数的数根等于这个数除9之后的余数
!!!但是x小于10时,即可求出数根,则一个数如果是9的倍数,数根为9
即上述 y = 9*n +x 计算过程中,0<x<=9,推理递归到 x 小于10时就计算出结果
y = 0 : dr(y) = 0
y%9 == 0 : dr(y) = 9
y%9 > 0 : dr(y) = y%9
解答
py
class Solution(object):
def addDigits(self, num):
"""
:type num: int
:rtype: int
"""
return (num-1)%9 + 1 if num >0 else 0
C#
public class Solution {
public int AddDigits(i> nt num) {
> return num == 0 ? 0 : (num-1)%9 + 1;
}
}