两层while循环,第一层判断是不是加到只剩一位了,第二层循环负责累加各位的和。
class Solution {
public:
int addDigits(int num) {
while (num >= 10)
{
int temp = num;
num = 0;
while (temp > 0)
{
num = num + temp % 10;
temp = temp / 10;
}
}
return num;
}
};
最优解思路:
这是一个树根(digit root)问题。关于digit root的定义:
首先我们证明(a+b) mod 9=a mod 9+ b mod 9:
设a mod 9=m; b mod 9 =n;
即 a=x*9+m; b=y*9+n;
即 (a+b) mod 9=(x*9+m+y*9+n) mod 9=m+n=a mod 9+ b mod 9;
然后我们证明一个数和它的各数位之和的模9相同:
12,345 = 1 × (9,999 + 1) + 2 × (999 + 1) + 3 × (99 + 1) + 4 × (9 + 1) + 5
12,345 = (1 × 9,999 + 2 × 999 + 3 × 99 + 4 × 9) + (1 + 2 + 3 + 4 + 5)
12,345 = (1 × 9,999 + 2 × 999 + 3 × 99 + 4 × 9) + (1 + 2 + 3 + 4 + 5)
所以12345 mod 9=(1+2+3+4+5) mod 9
最后:
已知一个数a0>10,它的各位数之和是a1>10;
a1的各位数之和a2>10;
...
以此类推直到ak<10;
我们知道a0 mod 9=a1 mod 9=...ak mod 9=ak;
这道题的是要求a0的ak,那么只要求 a0 mod 9就可以了。
但是又注意到如果ak是9,那么其实应该输出9而不是0,所以我们更正为:
一个数num的digit root等于 1+(num-1) mod 9;
class Solution {
public:
int addDigits(int num) {
return 1 + (num - 1) % 9;
}
};