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
- 258.Add Digits
- 【LeetCode】258.Add Digits
- 258. Add Digits
- LeetCode 258. Add Digits
- 258. Add Digits
- LeetCode : 258. Add Digits
- 258. Add Digits
- 258. Add Digits
- 258. Add Digits
- 258. Add Digits
- 258. Add Digits
- leetCode 258. Add Digits
- LeetCode 258. Add Digits
- 258. Add Digits LeetCode
- 258. Add Digits
- 258. Add Digits
- LeetCode 258. Add Digits
- 258. Add Digits
- notify()和notifyAll()的区别
- HDU 1198 Farm Irrigation (并查集)
- HQL查询和Criteria查询
- JAVA EE7 Servlet 3.1新规范与中文乱码问题
- spring-boot-maven-plugin 插件的作用
- 258. Add Digits
- 胜利一中高一年级课件分享
- 手机开发实战16——GPRS APN介绍
- 各分辨率图片生成神器
- 下载年鉴的网站
- 深入理解trace.tracebegin
- 论strpos 的正确使用方式
- Celery(一)---------使用Celery的第一步
- 第10、11周项目2 存储班长信息的学生类(2)