Digital Root(數根推導)

今天在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=0n1ai10i

其中ai 表示從低到高的每一位,因爲10i1i1(mod9) ,那麼 
xi=0n1ai(mod9)

也就是說

一個數和他各位數之和的模9同餘

我們使 

f(x)=i=0n1ai

也就是 
f(x)x(mod9)

則有 
f(f(x))f(x)x(mod9)

就是說每次累加模9的操作對於原數直接取模9是一樣的,但只適用於x≢0(mod9)

完整的公式爲 

dr(n)=0,9,nmod9,if n=0if n0,n0(mod9)if n≢0(mod9)

最後推導出

digital root = 1 + ((num - 1) % 9)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章