LeetCode-258.-Add Digits

题目:求各位数之和,直到只有1位为止,例如38,3+8=11,1+1=2。使用O(1)的算法

Given num = 38, the process is like: 3 + 8 = 111 + 1 = 2. Since 2 has only one digit, return it.

思路:digital root 

12345 = 1 * 9999 + 2 * 999 + 3 * 99 + 4 * 9+ 5 + (1+ 2+ 3 + 4 + 5)

只要证明:12345 % 9 = (1 + 2 + 3 + 4 +5 ) % 9 就能往下递推了。

那么,我们已知:

m % 9 = a; n % 9 = b 即 m = 9 * x +a; n = 9 * y + b;可推出(m + n) % 9 = a + b = m % 9 + n % 9;

[1 * 9999 + 2 * 999 + 3 * 99 + 4 * 9 + (1+2+ 3 + 4 + 5)] % 9 = (1 * 9999) % 9 + (2 * 999) % 9 + (3 * 99) % 9 + (4 * 9) %9 + (1+ 2+ 3 + 4 + 5) % 9 = 0 + 0 + 0 + 0 + (1 + 2 + 3 + 4 + 5) % 9 = (1 + 2 +3 + 4 + 5) % 9。

证明完成:12345 % 9 = (1 + 2 + 3 + 4 + 5) % 9 ;

因为题中最后一个数恰好是小于10,与取mod 9结束也一致,所以:

(12345) % 9 = (1 + 2 + 3 + 4 + 5) % 9 = 12% 9 = (1 +2) % 9 = 3 % 9 = 3。

本题中,因为最后输出小于10的数,因此当该数能被9整除时,n%9=0,为了避免这种情况,先进行减一操作再进行加一操作,得到通用的公式:sum=1+(num-1)%9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值