Question

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

Solution

dividend = divisor * quotient + remainder

而我们知道对于任何一个数可以表示为Σi * 2x  其中i为0或1。所以我们可以用加法实现乘法。

a = a + a 等同于 a = a * 2

因此我们可以通过对divisor乘以2,求出最大的x,然后继续求出第二大,第三大的x', x''..

注意到可能有溢出问题,解决方法是将要计算的所有数先转为long。

 public class Solution {
public int divide(int dividend, int divisor) {
boolean negative = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0);
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
if (a < b) {
return 0;
}
long step, sum, result = 0;
while (a >= b) {
step = b;
sum = 1;
while (step + step <= a) {
step += step;
sum += sum;
}
a = a - step;
result += sum;
}
result = negative == true ? -result : result;
if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
}
return (int)result;
}
}

最新文章

  1. 移动端css知识总结--字体,毛玻璃效果,input和disabled
  2. mysql客户端导入sql文件命令
  3. re正则表达式7_{}
  4. UVAoj 11324 - The Largest Clique(tarjan + dp)
  5. wen7安装oracle 11g出现&quot;未找到文件 E:\development_tools\database\oracle\install_d\dbhome\owb\external\oc4j_applications\applications\WFMLRSVCApp.ear&quot;
  6. java web 插件式开发
  7. Oracle 启动状态解说
  8. 三十项调整助力 Ubuntu 13.04 更上一层楼
  9. NSString 用法大全。
  10. jsp简单练习-简单的下拉表单
  11. 判断Android应用是否安装、运行
  12. python中字符串拆分与合并——split()、join()、strip()和replace()
  13. HBase Filter及对应Shell
  14. mybatis缓存机制
  15. Gym 101873I - Uberwatch - [DP]
  16. 1)HDFS分布式文件系统 2)HDFS核心设计 3 )HDFS体系结构
  17. bzoj 1798 线段树
  18. C语言运算符优先级及结合性
  19. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用
  20. 微软Build 2017开发者大会午夜趴

热门文章

  1. BHO多线程中实现右键菜单
  2. 利用Visual Studio寻找C#程序必要的运行库文件
  3. Android apk获取系统权限
  4. hdu 4869 Turn the pokers(组合数+费马小定理)
  5. Oracle的sql语句中case关键字的用法 &amp; 单双引号的使用
  6. itoa的源代码实现
  7. Struts2 页面url请求怎样找action
  8. sql 表名为关键字
  9. HelloCharts pie饼图绘制
  10. String.equals()