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
相关文章推荐
- 深入解析array_merge函数的用法 php
- 手机开发实战16——GPRS APN介绍
- notify()和notifyAll()的区别
- JAVA EE7 Servlet 3.1新规范与中文乱码问题
- 深入解析array_merge函数的用法 php
- (一)Java虚拟机基础详解
- SSH总结
- 手机开发实战15——GPRS系统组成
- 剑指Offer:旋转数组的最小数字
- RAM评估方法详解
- CAS客户端过滤器源码备忘
- 远离职场中的舒适区
- 求Fibonacci数列前40个数
- 本地yum-仓库搭建
- hdu 3635 Dragon Balls
- sitemap.xml 静态和动态生成页面 shopnc二次开发 动态生成sitemap.xml
- 作业练习3
- Spring框架AOP源码剖析
- c++文件的读取
- typedef的用法总结