1. Problem Description
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?
給一個數字,一直求它的各位和,直到這個數字小於10爲止。
2. My solution1(Loop)
直接模擬過程,其中wei是求各位和函數。class Solution {
public:
int wei(int num)
{
int ans=0;
while(num>0)
{
ans+=num%10;
num/=10;
}
return ans;
}
int addDigits(int num) {
int tmp=num;
while(tmp>=10)
tmp=wei(tmp);
return tmp;
}
};
3. My solution2(O[1]算法)
class Solution{
public:
int addDigits(int num)
{
if(num==0) return 0;
if(num%9==0) return 9;
else return num%9;
}
};
接下來我們將利用已知定理證明:
已知:
①( a + b ) % x =a % x + b % x
②遞歸重複求解一個x進制數num的各位之和,最終一定得到一個(0~x-1)之間的數
可得:
①一個n位x進制數num的各位之和對(x-1)取餘,與這個數num本身對(x-1)取餘的答案相同。
②遞歸重複求解一個x進制數num的各位之和對(x-1取餘),與這個數num本身對(x-1)取餘的答案相同。
證明:
任何一個10進制數num,都可以表示成這樣一個多項式和,如4位數。
這裏以2369爲例。
8765=8+7+6+5+8*999+7*99+6*9+5*0
我們知道這個式子中右邊的部分8*999+7*99+6*9+5*0一定可以被9整除,他們對9取餘得到0。
又已知存在定理:
①( a + b ) % x =a % x + b % x
也就是說:
8765 % 9 =(8+7+6+5)% 9 +(8*999+7*99+6*9+5*0)% 9 =(8+7+6+5)% 9 ……………①
8765% 9 = 26 % 9 = 8
於是我們得到一個新的結論:
一個n位x進制數num的各位之和對(x-1)取餘,與這個數num本身對(x-1)取餘的答案相同。
現在我們想要知道這個數各位一直求和得到的0~9之間的數是多少,就將其對9取模即可。
所以得到return num%9就可以了。但是當num=9的倍數時,最後一步將得到9;當num=0時,又會得到0,需要特殊判定一下。
if(num==0) return 0;
if(num%9==0) return 9;
else return num%9;
網上總結出的公式,也可以直接:
return (num-1)%9+1