258. Add Digits

来源:互联网 发布:淘宝客链接怎么看 编辑:程序博客网 时间:2024/06/14 20:40

Problem

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.

Solution

一般方法

class Solution {public:    int cal(int num)    {        int sum = 0;        while(num)        {            sum+=num%10;            num/=10;        }        return sum;    }    int addDigits(int num) {        while(num > 9)        {            num = cal(num);        }        return num;    }};

Digital root方法

任何一个整数模9同余于它的各数位上数字之和。

证明:
求证:N≡M(mod 9).
证明:
∵ N=a[n]a[n-1]…a[0]=a[n]*10^n+a[n-1]*10^(n-1)+…+a[1]*10+a[0].
又∵ 1≡1(mod 9),
10≡1(mod 9),
10^2≡1(mod 9),

10^n≡1(mod 9).
上面这些同余式两边分别同乘以a[0]、a[1]、a[2]、…、a[n],再相加得:
a[0]+a[1]*10+…+a[n]*10^n≡(a[0]+a[1]+…+a[n])(mod 9),
即 N≡M(mod 9),得证。

设操作f(N)=M,则此结论即为N≡f(N)(mod 9),

继续做f操作即 f(N)≡f(f(N))(mod 9),以此类推,直到M为Digit Root。

这时N≡M(mod 9),N为原数,M即为Digit Root。

即 N%9 = M%9,M为Digit Root,M范围是1~9,M%9范围是0~8,所以不管M取1~9任何数,M=(M-1)%9 + 1,利用这个等式可以消除9%9=0这个例外。

利用取模运算的下面定理:

若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p)

N≡M(%9) => N-1≡M-1(%9)

=> (N-1)%9 = (M-1)%9 => (N-1)%9+1 = (M-1)%9 + 1

从上面推断出(M-1)%9 + 1就是要求的Digit Root

因为本题最终要求的DigitRoot是 (N-1)%9+1

0 0
原创粉丝点击