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;
}
};