前言:内容包括:题目,代码实现,大致思路
目录
题目:
代码实现:
大致思路:
题目:
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
示例 2:
输入: num = 0
输出: 0
代码实现:
int addDigits(int num)
{
return (num - 1) % 9 + 1;
}
大致思路:
题目所求的是数字num的数根
下面列出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
可以发现:数根按照1~9的顺序循环出现
1 若是数字num是9的倍数,则数根为9
比如:9的数根是9,18的数根是9,27的数根是9
2 若是数字num不是9的倍数,则数根为num%9
比如:10的数根是1(10%9)11的数根是2(11%9) 12的数根是3(12%9)
num不是9的倍数,其数根的求法有公式:num%9
但是num为9的倍数时若也沿用num不是9的倍数时的公式,则计算错误
结合1 2两点,推出数根公式:
(num-1)%9+1
比如:若是num为9(num是9的倍数),按照num%9的公式计算,则求得的数根为0,而不是为9
所以先让num-1,变成8,那么%9的结果就不会为0,而是8,再+1即可得到正确的数根
(num-1)%9+1:
num-1:先让原数向左偏移一位
(num-1)%9:得到的结果是真正的数根值-1
(num-1)%9+1: 得到数根
原数: 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
偏移: 0 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
取余: 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 0 1 2
数根: 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