给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
示例 2:
输入: num = 0
输出: 0
题解:
前言
这道题的本质是计算自然数 num 的数根。
数根
又称数字根(Digital root),是自然数的一种性质,每个自然数都有一个数根。对于给定的自然数,反复将各个位上的数字相加,直到结果为一位数,则该一位数即为原自然数的数根。
计算数根的最直观的方法是模拟计算各位相加的过程,直到剩下的数字是一位数。利用自然数的性质,则能在 O(1) 的时间内计算数根。
我们看一下下列的数根
通过实例可以发现,按顺序来都是9个一组,那么我们是不是可以通过取余的方法来实现呢?但是如果是9的倍数的话,余数就为0了。因此在原数的基础上减1之后取余再加1.
class Solution {
public int addDigits(int num) {
return (num - 1) % 9 + 1;
}
}