• 【力扣】两数相除(c/c++)


    目录

    题目

    注意:

    示例 1:

    示例 2:

    提示:

    题目解析

    题目思路

    代码思路

    数据处理

    注意

    减法函数

    第一次使用的函数

    问题

    第二次改良后的代码

    处理i的值并且返回

    总代码

    力扣的代码

    注意


    题目

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

    整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

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

    注意:

    假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

    示例 1:

    输入: dividend = 10, divisor = 3
    输出: 3
    解释: 10/3 = 3.33333.. ,向零截断后得到 3 。

    示例 2:

    输入: dividend = 7, divisor = -3
    输出: -2
    解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。

    提示:

    • -231 <= dividend, divisor <= 231 - 1
    • divisor != 0
      1. if (dividend == 0)return 0;
      2. if (divisor == 1)return dividend;
      3. if (divisor == -1)
      4. {
      5. if (dividend > INT_MIN) return -dividend;// 只要不是最小的那个整数,都是直接返回相反数就好啦
      6. return INT_MAX;// 是最小的那个整数,都是直接返回最大值
      7. }

    题目解析

    这是一个让你不用除法来实现除法的题目

    很奇怪,代码中不能直接或者间接的用除法,乘法,以及求余

    题目思路

    由于还可以用减法以及加法

    这时候可以想到小学的知识

    除法的本质就是看在被除数中有几个除数

    我们可以用减法来依次减去就可以了

    代码思路

    越界的情况

    首先我们要判断给出的值越界的情况

    1. if (dividend == 0)return 0;
    2. if (divisor == 1)return dividend;
    3. if (divisor == -1)
    4. {
    5. if (dividend > INT_MIN) return -dividend;// 只要不是最小的那个整数,都是直接返回相反数就好啦
    6. return INT_MAX;// 是最小的那个整数,都是直接返回最大值
    7. }

    数据处理

    之后我们判断除数与被除数之间的的符号关系并且记录下来

    并且为了方便结算全部取绝对值

    1. long long i = 0;
    2. //判断是否异号
    3. long long sum_1 = (long long)dividend * divisor;
    4. //取绝对值
    5. if (dividend < 0)
    6. dividend = -dividend;
    7. if (divisor < 0)
    8. divisor = -divisor;

    注意

    这里的long long的数据类型是为了防止给出的数据相乘后越界,并且把其中“i”变量的值记录下来用于返回

    减法函数

    第一次使用的函数

    原来是用这个函数的

    1. while (dividend >= divisor)
    2. {
    3. dividend=dividend-divisor;
    4. i++
    5. }

    问题

    运行时间可能会慢因为除数是21亿并且除数是2的话要运行10亿次

    第二次改良后的代码

    1. while (dividend >= divisor)
    2. {
    3. long long j = 1;
    4. long long sum_3 = divisor;
    5. while (dividend> sum_3 + sum_3)
    6. {
    7. sum_3 = sum_3 + sum_3;
    8. j = j + j;
    9. }
    10. dividend = dividend - sum_3;
    11. i = i + j;
    12. }

    这个实现方法就是

    如果是144除以2第一步执行的是144-64第二步为80-64第三步为16-16

    这样运行步骤会大大降低

    处理i的值并且返回

    1. if (sum_1 < 0)
    2. i = -i;
    3. return i;

    总代码

    可以直接运行的代码

    1. #include
    2. using namespace std;
    3. int divide(long long dividend, long long divisor)
    4. {
    5. if (dividend == 0)return 0;
    6. if (divisor == 1)return dividend;
    7. if (divisor == -1)
    8. {
    9. if (dividend > INT_MIN) return -dividend;// 只要不是最小的那个整数,都是直接返回相反数就好啦
    10. return INT_MAX;// 是最小的那个整数,都是直接返回最大值
    11. }
    12. long long i = 0;
    13. //判断是否异号
    14. long long sum_1 = (long long)dividend * divisor;
    15. //取绝对值
    16. if (dividend < 0)
    17. dividend = -dividend;
    18. if (divisor < 0)
    19. divisor = -divisor;
    20. while (dividend >= divisor)
    21. {
    22. long long j = 1;
    23. long long sum_3 = divisor;
    24. while (dividend> sum_3 + sum_3)
    25. {
    26. sum_3 = sum_3 + sum_3;
    27. j = j + j;
    28. }
    29. dividend = dividend - sum_3;
    30. i = i + j;
    31. }
    32. if (sum_1 < 0)
    33. i = -i;
    34. return i;
    35. }
    36. int main()
    37. {
    38. //可改传递的数据
    39. int a = divide(-2147483648, -3);
    40. cout << a << endl;
    41. return 0;
    42. }

    力扣的代码

    力扣提交的代码

    1. class Solution {
    2. public:
    3. int divide(long long dividend, long long divisor)
    4. {
    5. if (dividend == 0)return 0;
    6. if (divisor == 1)return dividend;
    7. if (divisor == -1)
    8. {
    9. if (dividend > INT_MIN) return -dividend;// 只要不是最小的那个整数,都是直接返回相反数就好啦
    10. return INT_MAX;// 是最小的那个整数,都是直接返回最大值
    11. }
    12. long long i = 0;
    13. //判断是否异号
    14. long long sum_1 = (long long)dividend * divisor;
    15. //取绝对值
    16. if (dividend < 0)
    17. dividend = -dividend;
    18. if (divisor < 0)
    19. divisor = -divisor;
    20. while (dividend >= divisor)
    21. {
    22. long long j = 1;
    23. long long sum_3 = divisor;
    24. while (dividend> sum_3 + sum_3)
    25. {
    26. sum_3 = sum_3 + sum_3;
    27. j = j + j;
    28. }
    29. dividend = dividend - sum_3;
    30. i = i + j;
    31. }
    32. if (sum_1 < 0)
    33. i = -i;
    34. return i;
    35. }
    36. };

    注意

    代码不难,注意越界的数据越界的问题

  • 相关阅读:
    2022 年恶意软件趋势与安全最佳实践
    Js中常见的数据结构(Data Structure)
    百度发布Q3财报:AI原生应用驱动业绩增长 公司股价应声涨超5%
    备战蓝桥杯Day20 - 堆排序的实现
    【计算机网络:自顶向下方法】(一)计算机网络和英特网
    SpringCloud基础7——Redis分布式缓存
    Docker篇-(2)-Docker安装-centos
    探索4D毫米波雷达和摄像头在自动驾驶中的潜力
    【编程题】【Scratch四级】2021.03 程序优化
    因子与质因子的关系
  • 原文地址:https://blog.csdn.net/mumuemhaha/article/details/132647290