今天在leetcode上面碰到了在O(1)時間解決數根問題,後來發現運用數學公式確實可以在常數時間內解決。
For base b (decimal case b = 10), the digit root of an integer is:
- dr(n) = 0 if n == 0
- dr(n) = (b-1) if n != 0 and n % (b-1) == 0
- dr(n) = n mod (b-1) if n % (b-1) != 0
or
- dr(n) = 1 + (n - 1) % 9
Note here, when n = 0, since (n - 1) % 9 = -1, the return value is zero (correct).
推導過程:參考http://blog.csdn.net/ray0354315/article/details/53991199
推導:假定十進制數n,表達式寫爲
x=∑i=0n−1ai10i
其中ai 表示從低到高的每一位,因爲10i≡1i≡1(mod9) ,那麼
x≡∑i=0n−1ai(mod9)
也就是說
一個數和他各位數之和的模9同餘
我們使
f(x)=∑i=0n−1ai
也就是
f(x)≡x(mod9)
則有
f(f(x))≡f(x)≡x(mod9)
就是說每次累加模9的操作對於原數直接取模9是一樣的,但只適用於x≢0(mod9)
完整的公式爲
dr(n)=⎧⎩⎨⎪⎪⎪⎪⎪⎪0,9,nmod9,if n=0if n≠0,n≡0(mod9)if n≢0(mod9)
最後推導出
digital root = 1 + ((num - 1) % 9)