博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 29——两数相除
阅读量:5237 次
发布时间:2019-06-14

本文共 1845 字,大约阅读时间需要 6 分钟。

1. 题目

1240

2. 解答

2.1. 方法一

题目要求不能使用乘法、除法和除余运算,但我们可以将除法转移到对数域

\[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{lna - lnb}\]

这样就转化为指数、对数和减法运算了。因为只能对正整数取对数,因此我们首先要将两个数都取绝对值,最后再加上符号。

同时,题目要求只能存储 32 位有符号整数,因此,当数据大于上边界时,需要进行特殊处理。

class Solution {public:         int divide(int dividend, int divisor) {        if(dividend == 0)  return 0;        double a = fabs(dividend);        double b = fabs(divisor);                long result = exp(log(a) - log(b));                if ((dividend < 0) ^ (divisor < 0)) result = -result;                if (result > INT_MAX) result = INT_MAX;                return result;    }};

2.2. 方法二

利用移位操作。看下面的例子:

\[ 10 \implies 2^1 * 3 + 2^0 * 3 \to \frac{10} {3} = 2^1 + 2^0 = 3\]

\[ 10 \implies 2^2 * 2 + 2^0 * 2 \to \frac{10} {2} = 2^2 + 2^0 = 5\]
\[ 10 \implies 2^3 * 1 + 2^1 * 1 \to \frac{10} {3} = 2^3 + 2^1 = 10\]

我们可以对被除数进行分解。以 10 和 3 为例,首先我们确定 3 的最高次系数,\(10 > 3*2^1\) && \(10 < 3*2^2\),因此最高次系数为 2。然后我们用 10 减去 \(3*2^1\),继续进行刚才的过程,\(4 > 3*2^0\) && \(4 < 3*2^1\),2 的第二高次系数为 1。我们循环进行这个过程,直到最后的数小于除数为止,这些除数前面所有系数的和即为所求。

class Solution {public:         int divide(int dividend, int divisor) {          long a = labs(dividend); // long 型数据占 8 个字节,labs() 函数对 long 求绝对值        long b = labs(divisor);        long temp = b;                long result = 0;        long cnt = 1;                while (a >= b)        {            cnt = 1;            temp = b;            while (a >= (temp << 1))            {                temp  = temp << 1;                cnt = cnt << 1; // 表征除数前面的各次系数            }                        a -= temp;            result += cnt;                  }                if ((dividend < 0) ^ (divisor < 0)) result = -result;                  if (result > INT_MAX) result = INT_MAX; // INT_MAX = 2^32 - 1                return result;    }};

获取更多精彩,请关注「seniusen」!

1240

转载于:https://www.cnblogs.com/seniusen/p/9853565.html

你可能感兴趣的文章
ubuntu12 root账户自动登录
查看>>
C#认证二单元 第一题
查看>>
软件测试lab by石家名
查看>>
两条SQL语句
查看>>
Resin 4.0 部署SSL证书
查看>>
详解用CSS3制作圆形滚动进度条动画效果
查看>>
谷歌浏览器调试大全
查看>>
使用重构的方式制作出一个如下图的水平、垂直都居中短边为50px,长边为150px的红色十字架。...
查看>>
cookie注意事项
查看>>
基于tensorflow的逻辑分类
查看>>
关于css,js放置位置的问题
查看>>
python之路 -- 爬虫 -- Scrapy入门
查看>>
OC基础8:分类和协议
查看>>
C#依据进程名称获取进程的句柄?
查看>>
音乐TV2015校园招聘A第二大发行量(对中国科学院大学站)
查看>>
工作日志2014-08-28
查看>>
Google App Engine 学习和实践
查看>>
MySQL 常用到的几个字符处理函数
查看>>
20145203 盖泽双《Java程序设计》第一周的学习总结
查看>>
使用opencv显示视频的方法
查看>>