您的位置:首页 > 其它

258. Add Digits

2016-05-14 11:09 351 查看

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
a[n-1]…a[0]=a
*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
,再相加得:

a[0]+a[1]*10+…+a
*10^n≡(a[0]+a[1]+…+a
)(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: