Question
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.
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?
Hint
- naive implementation of the above process is trivial. Could you come up with other methods?
- hat are all the possible results?
- ow do they occur, periodically or randomly?
- ou may find this Wikipedia article useful.
Java Code
/**
*
* 同余定理公式:
* (a + b)%n = (a%n + b)%n = (a + b%n)%n = (a%n + b%n)%n
* (a * b)%n = (a%n * b)%n = (a * b%n)%n = (a%n * b%n)%n
*
*/
//版本一:利用理论计算
public int addDigits(int num) {
if(num == 0) return 0;
return (num %= 9) == 0 ? 9 : num;
}
//版本二:对num依次对10取余取整,得到各个数位,计算的和重新赋值给num,直到num为个位数
public int addDigits2(int num) {
int sum = num;
while(num > 9) {
sum = num % 10;
while((num /= 10) > 0)
sum += num % 10;
num = sum;
}
return sum;
}