题目:求各位数之和,直到只有1位为止,例如38,3+8=11,1+1=2。使用O(1)的算法
Given num = 38
, the process is like: 3 + 8 = 11
, 1 + 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