题目:给定一个非负整数 num
,反复将各个位上的数字相加,直到结果为一位数。返回这个结果
举例:
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
震惊!资深循环使用工程师第一印象绝对是穷举模拟各位相加的过程,直到剩下的数字是一位数。每次计算当前整数除以10的余数得到最低位数,将最低位数加到总和中,然后将当前整数除以 10。以此类推
int addDigits(int num) {
int res =0;
while(num>0)/*循环得到每一位,然后相加*/
{
res+=num%10;
num/=10;
}
while(res>=10)/*返回个位数,方法同上*/
{
res = res%10+res/10;
}
return res;
多么有格调的代码,让人赞叹;提交代码一看:
现在我来看看大神们是怎么处理的:
关键字:数根
将一正整数的各个位数相加(即横向相加)后,若加完后的值大于等于10的话,则继续将各位数进行横向相加直到其值小于十为止所得到的数,即为数根
定义不就是题干吗?
return (num-1)%9+1;
首先把1-30的数根找出来,看看有什么规律
妥了,9个一组,9的倍数;原数左移1位对9取模,再+1