码迷,mamicode.com
首页 > 其他好文 > 详细

【LeetCode】P029_DivideTwoIntegers

时间:2015-09-07 12:26:06      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

【题目】

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

If it is overflow, return MAX_INT.

题目的意思就是:不使用*、/、%运算符进行除法运算

【思路】

这道题最直接的想法,就是被除数每次减去除数,计算减了多少次,即为所求。但是这个办法的效率太低,试想被除数是Integer.MAX_VALUE(2147483647),除数是1,则要减2147483647次,很明显会发生TLE。

更好的方法:
不是每次减去除数,而是每次减后除数*2,结果每次累加除数的相应的倍数。

【代码】

  1. public class P029_DivideTwoIntegers {
  2. public int divide(int dividend, int divisor) {
  3. int sign = 1;
  4. if (dividend < 0) {
  5. sign = -sign;
  6. }
  7. if (divisor < 0) {
  8. sign = -sign;
  9. }
  10. long n1 = Math.abs((long)dividend);
  11. long n2 = Math.abs((long)divisor);
  12. long ans = 0;//用long是为了处理溢出,比如当ans为2147483648的情况
  13. while (n1 >= n2) {
  14. long base = n2;
  15. for (int i = 0; n1 >= base; i++) {
  16. n1 -= base;
  17. base<<=1;
  18. ans+=1<<i;
  19. }
  20. }
  21. //处理溢出的情况
  22. //int的范围为-2147483648到2147483647
  23. //dividend=Integer.MIN_VALUE,即-2147483648
  24. //divisor=-1,此时将发生溢出,按题目要求,返回Integer.MAX_VALUE
  25. if (ans * sign > Integer.MAX_VALUE)
  26. return Integer.MAX_VALUE;
  27. return (int) (sign*ans);
  28. }
  29. }




【LeetCode】P029_DivideTwoIntegers

标签:

原文地址:http://www.cnblogs.com/yeyang/p/4788292.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!