题目:给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
(来源:力扣(LeetCode))
思路:(暂时不看进阶的说明)解决这道题的方法很简单,跟着题目的意思走,无非是用循环加递归实现 :将输入的数字一位一位相加,最后要是相加结果小于10,则直接返回;否则继续调用函数自身,直至递归出口。
代码:
int addDigits(int num)
{
int sum=0;
if(num<10)
return num;
else
{
while(num!=0)
{
sum=sum+num%10;
num=num/10;
}
return sum<10?sum:addDigits(sum);
}
}
由于“进阶”的说明存在,那这题一定有比递归+循环更简单的方法。
不妨先写几个数看看:
运算前 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
运算后 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
运算前 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
运算后 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
运算前 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
运算后 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
以此类推。
不难发现,运算后的结果总是以1~9位一个循环,那自然会想到用模除求某一个数的运算结果是在这个循环中的哪一个个。于是,就可以写成:
int addDigits(int num)
{
if(num%9==0&&num!=0)//单独处理取余结果为零时的情况
return 9;
else
return num%9;
}
这个就是对于“进阶”说明的一个解法.在数学中,这个结果被称为“数根”。