题目描述:
给定一个非负整数 num
,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num = 38 输出: 2 解释: 各位相加的过程为: 38 --> 3 + 8 --> 11 11 --> 1 + 1 --> 2 由于 2是一位数,所以返回 2。示例 2:
输入: num = 0 输出: 0提示:
0 <= num <= 231 - 1
进阶:你可以不使用循环或者递归,在
O(1)
时间复杂度内解决这个问题吗?
class Solution {
public int addDigits(int num) {
}
}
代码实现:
方法一:模拟法
最直观的方法是模拟各位相加的过程,直到剩下的数字是一位数。
计算一个整数的各位相加的做法是,每次计算当前整数除以 101010 的余数得到最低位数,将最低位数加到总和中,然后将当前整数除以 101010。重复上述操作直到当前整数变成 000,此时的总和即为原整数各位相加的结果。
class Solution {
public int addDigits(int num) {
while (num >= 10) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
num = sum;
}
return num;
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/add-digits/solutions/1301157/ge-wei-xiang-jia-by-leetcode-solution-u4kj/
方法二:
这个问题可以使用很巧妙的数学方法来解决,叫做数字根(digital root)。数字根是一个数学属性,它是将一个非负整数的各个位上的数字相加,然后重复这个过程,直到得到的结果是个位数为止。
实际上,数字根就是对 9 取余(除非这个数本身就是 9 的倍数,此时数字根为 9)。
下面是一个 Java 方法的实现:
class Solution {
public int addDigits(int num) {
if (num == 0) {
return 0;
}
return (num - 1) % 9 + 1;
}
}
在上面的代码中,首先处理了特殊情况,即当输入参数为 0 时,直接返回 0。
对于其他情况,我们使用了 (num - 1) % 9 + 1
来计算数字根。这个表达式的含义是:如果 num - 1
是 9 的倍数,那么结果就是(0) + 1,否则就是 (num - 1) % 9 + 1
。