给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
解答:
/**
* 暴力解法1 : 将数字转字符数组,对每个字符强转为 int ,然后递归
* @param num
* @return
*/
public int addDigits(int num) {
char[] chars = String.valueOf(num).toCharArray();
int sum = 0;
for(char c : chars) {
Integer ic = Integer.parseInt(String.valueOf(c));
sum += ic;
}
if (sum > 9) {
return addDigits(sum);
}
return sum;
}
/**
* 暴力解法2 : 将 数字 % 10 的余数相加得到每一位的合,然后递归。
* @param num
* @return
*/
public static int addDigits2(int num) {
int sum = addNum(num);
while (sum > 9) {
sum = addNum(sum);
}
return sum;
}
/**
* 求非负数每一位数字的和
* @param num
* @return
*/
public static int addNum(int num) {
int sum = 0;
while (num / 10 > 0) {
sum += num % 10;
num = num / 10;
}
sum += num;
return sum;
}
/**
* 找规律。假设 num = 384 = 3 * 100 + 8 * 10 + 4
* 第一轮计算 sum = 15 = 3 + 8 + 4
* 差值 = 3 * 99 + 8 * 9 = (3 * 11 + 8) * 9 即差值为9的倍数
* 第二轮计算 num = 15 = 1 * 10 + 5
* sum = 6 = 1 * 0 + 5
* 差值 = 9
* 由此得出规律:num % 9
* 注意:需要注意 9 的整倍数最终结果应该返回9,小于10的数直接返回
*
* @param num
* @return
*/
public static int addDigits3(int num) {
if (num < 10) {
return num;
}
int res = num % 9;
if (res == 0) {
return 9;
}
return res;
}