当前位置:   article > 正文

leetcode题解:两数相除_c语言 lee两数相除

c语言 lee两数相除

题目描述

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

来源:力扣(LeetCode

 题目分析

整除计算,不允许使用乘除和mod运算,因此考虑采用加减运算,比较大小来进行除法的计算。除数和被除数的符号共有四种组合(++, +-, -+, --),因此需要考虑分情况讨论或统一符号运算。

* 累加来模拟除法,如何提高效率

第一思路:递归法

采用最简单的思路,分四种情况分别逐个累加或累减操作。结果超出时间限制,单倍累加效率过低

  1. while(cnt + cnt > dividend){
  2.             mul += 1;
  3.             cnt += divisor;
  4. }

改进思路:

单倍累加过于低效,采用2的幂次方倍来逐次累加,加快搜索速度。

  1. static long _div(long dividend, long divisor){
  2. if (dividend > divisor) return 0;
  3. long mul = 1, cnt = divisor;
  4. // 采用 2的幂次方来扩大步幅
  5. while(cnt + cnt > dividend){
  6. mul += mul;
  7. cnt += cnt;
  8. }
  9. return mul + _div(dividend - cnt, divisor);
  10. }
  11. int divide(int dividend, int divisor) {
  12. if (dividend == 0) return 0;
  13. bool sign = (dividend > 0) ^ (divisor > 0); // 异或操作,判断符号
  14. // 除数被除数都转为负数进行计算,正数最大值翻转时会出现溢出的情况
  15. if (dividend > 0) dividend = -dividend;
  16. if (divisor > 0) divisor = -divisor;
  17. // 此处采用递归来计算,可以考虑改为动态规划
  18. // 考虑到累加结果可能溢出,申请long来表示
  19. long res = _div(dividend, divisor);
  20. res = (sign)? -res : res;
  21. return res>INT_MAX?INT_MAX:res;
  22. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/441296
推荐阅读
相关标签
  

闽ICP备14008679号