一、題目名稱java
Add Digits (非負整數各位相加)git
二、題目地址code
https://leetcode.com/problems/add-digitsleetcode
三、題目內容開發
英文:Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.get
中文:有一個非負整數num,重複這樣的操做:對該數字的各位數字求和,對這個和的各位數字再求和……直到最後獲得一個僅1位的數字(即小於10的數字)。it
例如:num=38,3+8=11,1+1=2。由於2小於10,所以返回2。io
四、解題方法1class
最好想到的方法固然是模擬題目中所給的步驟,最終求出結果。一段實現該方法的Java代碼以下:方法
/** * 功能說明:LeetCode 258 - Add Digits * 開發人員:Tsybius2014 * 開發時間:2015年8月26日 */ public class Solution { /** * 給定整數不斷將它的各位相加,直到相加的結果小於10,返回結果 * @param num * @return */ public int addDigits(int num) { int next = getNext(num); while (next >= 10) { next = getNext(next); } return next; } /** * 獲取整數各位相加後的和 * @param num * @return */ private int getNext(int num) { String s = String.valueOf(num); int sum = 0; for (char ch : s.toCharArray()) { sum += (ch - '0'); } return sum; } }
五、解題方法2
另外一個方法比較簡單,能夠舉例說明一下。假設輸入的數字是一個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一次,並將模除後的結果加一返回。
/** * 功能說明:LeetCode 258 - Add Digits * 開發人員:Tsybius2014 * 開發時間:2015年8月25日 */ public class Solution { /** * 給定整數不斷將它的各位相加,直到相加的結果小於10,返回結果 * @param num * @return */ public int addDigits(int num) { return (num - 1) % 9 + 1; } }
END