题目来源
题目描述
题目解析
这道题让我们求数根,所谓树根,就是将大于10的数的各个位上的数字相加,若结果还大于0的话,则继续相加,直到数字小于10为止。
模拟
class Solution {
public:
int addDigits(int num) {
while (num > 9){
int sum = 0;
while (num != 0){
sum += (num % 10);
num = num / 10;
}
num = sum;
}
return num;
}
};
找规律
那么我们先来观察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取余,也就是x % 9
- 如果当前数不是9的倍数,那么可以写成: x % 9
- 如果当前数是9的倍数,得到的应该是9的本身,但是按照上面的数字得到的时0。为了兼容这种情况,可以写成:(n-1)%9+1
- 这时还需要处理一个特殊情况,那就是n = 0时,会出现 -1 % 9 所以我们要特判
class Solution {
public:
int addDigits(int num) {
return (num == 0) ? 0 : (num - 1) % 9 + 1;
}
};