LeetCode Add Digits

258. Add Digits

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.

Example:

Input: 38
Output: 2 
Explanation: The process is like: 3 + 8 = 11, 1 + 1 = 2. 
             Since 2 has only one digit, return it.

Follow up:
Could you do it without any loop/recursion in O(1) runtime?
258. Add Digits


题意就是把一个数的每一位相加,如果得到的和大于10,则对和的每一位继续相加,直到最后结果是小于10的。得到的这个数称为数根。 题目要求用O(1)的算法实现,要求好高啊,完全懵*,还是先实现一个常规的迭代算法吧:

class Solution2 {
public:
    int addDigits(int num)
    {
        int sum = num;
        while (sum > 9) {
            int cur_sum = 0;
            while (sum) {
                cur_sum += sum % 10;
                sum = sum / 10;
            }
            sum = cur_sum;
        }
        return sum;
    }
};

本代码提交AC,用时3MS。
后来网上搜索了一下,发现数根有规律,1~20的数根如下:
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10    1
11    2
12    3
13    4
14    5
15    6
16    7
17    8
18    9
19    1
20    2
每9个一个循环,而且结果是对9取模,但如果是9的倍数的话,结果还是9,所以为了一行搞定,可以用(n-1)%9+1来包括所有的情况。
完整代码如下:

class Solution {
public:
    int addDigits(int num)
    {
        return (num – 1) % 9 + 1;
    }
};

本代码提交AC,用时3MS。

Leave a Reply

Your email address will not be published. Required fields are marked *