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?
这题挺简单的,可是要我上来就用O(1)的方法,还是得分析一下,这种情况还能线性得到答案只有一种可能,结果可以用一行固定的公式表示,也就是结果存在显然的规律。
方法一:简单递归recursion
就是把结果循环递归直到计算出一位数返回。
int addDigits(int num) {
if (num/10 == 0) return num;
int temp, sum = 0;
while (num) {
sum += num % 10;
num = num / 10;
}
return addDigits(sum);
}
方法二:公式推导
找这种公式其实就是找规律,而且这种答案在固定范围的,例如这题答案在0-9这几种可能的,多半有结果循环的可能。写几组数试试看会发现,除了0之外,结果始终在1到9循环。显然,这是个对9取余的问题,怎么表示结果并考虑特殊情况是写的时候需要注意的。对9取余,若是9的倍数,余数为0,此时结果应该为9,这是一个,还有就是单独考虑0的结果是0。
简单代码如下:
int addDigits(int num) {
if (num == 0) return 0;
else {
int rmd = num % 9;
return (rmd == 0)? 9 : rmd;
}
}
后来看了看链接的Wikipedia,这种规律被总结为:
sum_digits = n - 9 * floor( (n - 1) / 9);
也就是:
int addDigits(int num) {
return num - 9 * ((num - 1) /9);
}