1. 程式人生 > >leetcode258-Add Digits(非負整數各位相加)

leetcode258-Add Digits(非負整數各位相加)

問題描述:

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

For example:

Given num = 38, 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?

有一個非負整數num,重複這樣的操作:對該數字的各位數字求和,對這個和的各位數字再求和……直到最後得到一個僅1位的數字(即小於10的數字)。

問題求解:

class Solution {
public:
    int addDigits(int num) {
        int res=num;
        while(true)
        {
            if(res < 10) return res;
            num=res;//每次把上次的結果res作為num重新計算
            res=0;//將本次res重置為0
            while(num)
            {
                res += num%10;
                num /= 10
; } } } };

方法二:
另一個方法比較簡單,可以舉例說明一下。假設輸入的數字是一個5位數字num,則num的各位分別為a、b、c、d、e。

有如下關係:num = a * 10000 + b * 1000 + c * 100 + d * 10 + e

即:num = (a + b + c + d + e) + (a * 9999 + b * 999 + c * 99 + d * 9)

因為 a * 9999 + b * 999 + c * 99 + d * 9 一定可以被9整除,因此num模除9的結果與 a + b + c + d + e 模除9的結果是一樣的。

對數字 a + b + c + d + e 反覆執行同類操作,最後的結果就是一個 1-9 的數字加上一串數字,最左邊的數字是 1-9 之間的,右側的數字永遠都是可以被9整除的。

這道題最後的目標,就是不斷將各位相加,相加到最後,當結果小於10時返回。因為最後結果在1-9之間,得到9之後將不會再對各位進行相加,因此不會出現結果為0的情況。因為 (x + y) % z = (x % z + y % z) % z,又因為 x % z % z = x % z,因此結果為 (num - 1) % 9 + 1,只模除9一次,並將模除後的結果加一返回。
轉自http://my.oschina.net/Tsybius2014/blog/497645

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