258.各位相加——Golang
给定一个非负整数num,反复将各个位上的数字相加,直到结果为一位数并返回这个结果。
难度:简单
示例1:
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
示例2:
输入: num = 0
输出: 0
提示:
进阶: 不使用递归或者循环,在O(1)复杂度内解决该问题。
解法1:
(1)对数字num的各位进行相加; (2)若相加后的结果小于10则返回; (3)否则循环步骤(1)直至各位相加后的数小于10. 例如:12345 => 1+2+3+4+5=15 => 1+5=6, 返回10
func addDigits(num int) int {
for num >= 10 {
ans := 0
for num >= 10 {
ans += num%10
num /= 10
}
num = ans
}
return ans
}
解法2:
num可表示成如下形式:
其中是num的各位相加的和;
其中必定是9的倍数即对9取余必为0,所以num%9的结果等于的结果,即num与其各位相加的结果模9同余。
重复计算各位相加的结果直到结果为一位数时,该一位数即为num的数根,num与其数根模 9同余。
注意:
(1)当num不是9的倍数时,num的树根=num%9;
(2)当num=0时,num%9=0,但答案ans=0;
(3)当num>0且num%9==0时,答案ans=9(9的倍数的数各位相加最后得到的一位数必为9)
func addDigits (num int) int {
if num < 10 {
return num
}
ans := num % 9
if num == 0 {
ans = 9
}
return ans
}
注意: 当 num>0 时,其数根的结果在范围[1,9]内,因此可以计算 (num-1)%9的结果然后加1。由于当 num>0时,num-1≥0,非负数除以9的余数一定也是非负数,因此计算 num−1除以9的余数然后加1的结果是对的。对于Go语言,对负数取余的结果的正负和左操作数相同,即-1%9=-1,再加上1也为正确结果。
func addDigits (num int) int {
return (num - 1) % 9 + 1
}