一.解法
https://leetcode-cn.com/problems/add-digits/
要点:数学
这道题可以用循环方法解决,将给定的数字的各个位相加得到新的数字,一直重复这个过程,直到这个数小于 10,将这个数输出,具体见C++版本。
这道题关键在于数学知识的应用可以直接解决,用数根的性质完成。
数根是将一正整数的各个位数相加(即横向相加),若加完后的值大于10的话,则继续将各位数进行横向相加直到其值小于十为止,或是,将一数字重复做数字和,直到其值小于十为止,则所得的值为该数的数根。把 1 到 30 的树根列出来如下:
原数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
数根: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3
可以发现数根 9 个为一组, 1 - 9 循环出现。我们需要做就是把原数映射到树根就可以,循环出现利用取余。
对于给定的 n 有三种情况。
n 是 0 ,数根就是 0。
n 不是 9 的倍数,数根就是 n 对 9 取余,即 n mod 9。
n 是 9 的倍数,数根就是 9。
可以把两种情况统一起来,我们将给定的数字减 1,相当于原数整体向左偏移了 1,然后再将得到的数字对 9 取余,最后将得到的结果加 1 即可。
原数是 n,数根就可以表示成 (n-1) mod 9 + 1
Python和Java都是直接用数学方法完成。
二.Python实现
class Solution:
def addDigits(self, num: int) -> int:
if num > 9:
num = num % 9
if num == 0:
return 9
return num
三.C++实现
class Solution {
public:
int addDigits(int num) {
if(num==0) return 0;
while(true){
if (num<10) break;
int temp=0;
while(num>0){
temp+=num%10;
num/=10;
}
num=temp;
}
return num;
}
};
四.java实现
class Solution {
public int addDigits(int num) {
return (num - 1) % 9 + 1;
}
}