Example 23
各位相加
题目概述:给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于2 是一位数,所以返回 2。
示例 1:
输入: num = 0
输出: 0
解题思路:这道题的本质是计算自然数num 的数根。
数根又称数字根(Digital root),是自然数的一种性质,每个自然数都有一个数根。对于给定的自然数,反复将各个位上的数字相加,直到结果为一位数,则该一位数即为原自然数的数根。
计算数根的最直观的方法是模拟计算各位相加的过程,直到剩下的数字是一位数。利用自然数的性质,则能在O(1) 的时间内计算数根。
最直观的方法是模拟各位相加的过程,直到剩下的数字是一位数。
计算一个整数的各位相加的做法是,每次计算当前整数除以10 的余数得到最低位数,将最低位数加到总和中,然后将当前整数除以10。重复上述操作直到当前整数变成0,此时的总和即为原整数各位相加的结果。
解题步骤:
1. 定义外部while循环,当num大于等于10时进入循环,说明还未处理完毕,否则说明num已经是个位数,已处理完毕,将num返回即可。
2. 在外部while循环中,定义变量sum存储该次处理过程中的各位之和,初始值设为0。
3. 定义内部while循环,当num大于0时,说明该次处理还未结束,进入循环,否则说明该次处理已经结束,各位之和已经存储到sum中,将sum的值赋给num,进行下一轮的判断处理。
4. 在内部while循环中,用num % 10,获取最后一位,累加到sum中,然后将num / 10,清除最后一位,再进行判断,num等于0时说明每一位都累加完毕,否则继续处理,直至每一位都累加完毕。
示例代码如下:
public class AddDigits { /** * 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。 * 示例 1: * 输入: num = 38 * 输出: 2 * 解释: 各位相加的过程为: * 38 --> 3 + 8 --> 11 * 11 --> 1 + 1 --> 2 * 由于2 是一位数,所以返回 2。 * 示例 1: * 输入: num = 0 * 输出: 0 * 来源:力扣(LeetCode) * 链接:https://leetcode.cn/problems/add-digits */ public static void main(String[] args) { AddDigits ad = new AddDigits(); System.out.println(ad.addDigits(38)); // 2 } /** * 官方 * * @param num * @return */ public int addDigits(int num) { while (num >= 10) { int sum = 0; while (num > 0) { sum += num % 10; num /= 10; } num = sum; } return num; } /** * 个人 * @param num * @return */ /*public int addDigits(int num) { String numStr = Integer.toString(num); while (numStr.length() != 1) { int tempNum = 0; for (int i = 0; i < numStr.length(); i++) { tempNum += Character.getNumericValue(numStr.charAt(i)); } numStr = Integer.toString(tempNum); } return Integer.parseInt(numStr); }*/ }