https://leetcode-cn.com/problems/add-digits/
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
思路: 由于两个个位数相加之后的数,再相加个位数为 num1 + num2 - 10 + 1;因此,从各位遍历到最高位一轮即可得出答案。
int addDigits(int num) {
if(num < 10){
return num;
}
int num1 = num % 10;
int num2 = 0;
int sum = 0;
while(num >= 10){
num = num / 10;
num2 = num % 10;
sum = num1 + num2;
if(num < 10){
if(sum < 10){
return sum;
}
sum = sum - 9;
return sum;
}else{
if(sum < 10){
num1 = sum;
}
else{
num1 = sum - 9; // 规律: 当sum > 10 时,和为num1 + num2 - 10 + 1
}
}
}
return num1;
}
不用循环思路:找出如下规律
a % 9 = a % 9;
ab%9 = (a * 10 + b) % 9 = (9a + a + b) % 9 = (a + b) % 9;
abc%9 = (a * 100 + b * 10 + c) % 9 = (99a + 9b + a + b + c) % 9 = (a + b + c) % 9;
因此num各位相加可以简化为num % 9,但有个特例:9 % 9 = 0; 18 %9 = 0; 因此要简单变换一下(num - 1)% 9 + 1;
int addDigits(int num) {
if (0 == num){
return 0;
}
return (num - 1)%9 + 1;
}