leetcode:各位相加(数学办法详解)

前言:内容包括:题目,代码实现,大致思路

目录

题目:

代码实现:

大致思路:


题目:

给定一个非负整数 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的数根

leetcode:各位相加(数学办法详解)_第1张图片

下面列出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 

你可能感兴趣的:(leetcode,leetcode)