leetcode 之 add digits
2016-01-18 23:34
253 查看
题目:
Given a non-negative integer
one digit.
For example:
Given
only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
解答:
这是ACM的一个典型的题目,就是digit root
首先要知道一个定理就是一个数模9的余数和它的所有位加起来的和模9的余数相同
证明如下:
假设一个数字为a[n-1].....a[0]
首先1 % 9 = 1 % 9
10 % 9 = 1 % 9
100 % 9 = 1 % 9
........
10^(n - 1) % 9= 1 % 9
两边同时乘以相应的位的值,再相加就有(a[n-1]*10^(n-1)) + ......+ a[0]) % 9 = (a[n-1] + .....a[0]) % 9
即已经证明
这样假设初始为num,f(num)为num的每个位的数字的和
num % 9 = f(num) % 9 = f(f(num)) % 9 =.....=t % 9
t就是最终的结果并且t小于等于9
所以很明显t = num- ((num- 1)/9 )* 9;
代码就是 return
num- ((num- 1)/9 )* 9;
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
2has
only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
解答:
这是ACM的一个典型的题目,就是digit root
首先要知道一个定理就是一个数模9的余数和它的所有位加起来的和模9的余数相同
证明如下:
假设一个数字为a[n-1].....a[0]
首先1 % 9 = 1 % 9
10 % 9 = 1 % 9
100 % 9 = 1 % 9
........
10^(n - 1) % 9= 1 % 9
两边同时乘以相应的位的值,再相加就有(a[n-1]*10^(n-1)) + ......+ a[0]) % 9 = (a[n-1] + .....a[0]) % 9
即已经证明
这样假设初始为num,f(num)为num的每个位的数字的和
num % 9 = f(num) % 9 = f(f(num)) % 9 =.....=t % 9
t就是最终的结果并且t小于等于9
所以很明显t = num- ((num- 1)/9 )* 9;
代码就是 return
num- ((num- 1)/9 )* 9;
相关文章推荐
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总