题目大意
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
思路
由于最后结果返回的是一位数,所以结果一定是对9取余数。举个例子对于整数"321",除了个位数字1以外,每次进位都是因为10 = 9+1。所以只需要指导321发生了几次进位即可。
代码一:数学方法
public int addDigits(int num) {
return (num-1)%9+1;
}
注意:用num-1%9为了统一9的整数倍,计算完以后再加回1对结果没有影响,实际上可以理解为向个位借了1,之后又还回去。
运行时间2ms,击败98.25%。
代码二:循环
此题可以用循环解决,每次算出各位数组之和与10比较,判断和是否为1位数,不符合继续计算。
public int addDigits(int num) {
int sum = num;
while(sum>=10) {
sum = solve(sum);
}
return sum;
}
private int solve(int num) {
int res = 0;
while(num>0) {
res += num%10;
num/=10;
}
return res;
}
运行时间3ms,击败86.03%。