题目解析:
题目链接:https://leetcode.com/problems/add-digits/description/
Given a non-negative integer num
, repeatedly add all its digits until the result has only
one digit.
给定一个非负整数num,重复相加所有位数的值直到结果只有一位。
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?
刚开始思路很常规,就是要不断取出整数位然后相加,一个多位数字num,num-num/10可以得到最后一位数值。代码如下:
class Solution {
public:
int addDigits(int num) {
int res = 0;
while(num >= 10)
{
int q = num / 10;
res+=(num-q*10);
num = num / 10;
}
res += num;
if(res >= 10)
{
return addDigits(res);//在vs里这里不用加return就可以,原因暂时未知,单步调试是会递归出来return res.
}
else
return res;
}
};
http://www.cnblogs.com/grandyang/p/4741028.html
那么我们先来观察1到20的所有的树根:
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 1
11 2
12 3
13 4
14 5
15 6
16 7
17 8
18 9
19 1
20 2
根据上面的列举,我们可以得出规律,每9个一循环,所有大于9的数的树根都是对9取余,那么对于等于9的数对9取余就是0了,为了得到其本身,而且同样也要对大于9的数适用,我们就用(n-1)%9+1这个表达式来包括所有的情况,所以解法如下:
解法二:
class Solution { public: int addDigits(int num) { return (num - 1) % 9 + 1; } };