题目

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

If it is overflow, return MAX_INT.

分析

题目要求不用 * / %三种运算符的条件下,求得两个int类型整数的商。

方法一:

很明显的,我们可以用求和累计的方法,求得商,但是该方法测试会出现TLE;参考博客提出解决办法:每次将被除数增加1倍,同时将count也增加一倍,如果超过了被除数,那么用被除数减去当前和再继续本操作,但是我测试结果依然是TLE。所以这道题的目的在于考察逻辑运算。

方法二:

该方法来源于参考博客但是该实现忽略了结果溢出的问题,需要加上结果是否溢出判断。

TLE(方法一)代码

//方法一,翻倍累和  结果是:Time Limit Exceeded
class Solution {
public:
int divide(int dividend, int divisor) { //如果被除数或者除数有一者为0 或者绝对值除数大于被除数则返回0
if (dividend == 0 || divisor == 0 || abs(divisor) > abs(dividend))
return 0; int sign = ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) ? 1 : -1; long long Dividend = abs(dividend), Divisor = abs(divisor); long long sum = 0;
int count = 0, ret = 0; while (Divisor <= Dividend)
{
count = 1;
sum = Divisor;
while ((sum + sum) < Dividend)
{
sum += sum;
count += count;
}
Dividend -= sum;
ret += count;
} if (sign == -1)
return 0 - ret;
else
return ret;
}
};

AC代码

//方法二:位运算
class Solution {
public:
int divide(int dividend, int divisor) { //如果被除数或者除数有一者为0 或者绝对值除数大于被除数则返回0
if (dividend == 0 || divisor == 0)
return 0; // without using * / mod
// using add
auto sign = [=](long long x) {
return x < 0 ? -1 : 1;
}; int d1 = sign(dividend);
int d2 = sign(divisor); long long n1 = abs(static_cast<long long>(dividend));
long long n2 = abs(static_cast<long long>(divisor)); long long ans = 0; while (n1 >= n2) {
long long base = n2;
for (int i = 0; n1 >= base; ++i) {
n1 -= base;
base <<= 1;
ans += 1LL << i;
}
}
//如果转换为int类型,结果溢出,返回INT_MAX ,int类型表示范围[-2147483648 , 2147483648)
if (ans > INT_MAX && d1 == d2)
return INT_MAX; int res = static_cast<int>(ans);
if (d1 != d2)
return -res;
else
return res;
}
};

GitHub测试程序源码

最新文章

  1. VMware安装chrome os遇到选择网络问题.
  2. 【转】NumPy-快速处理数据
  3. 配置&lt;authorization&gt;节(配置文件)
  4. bugzilla_firefox
  5. 当&quot;唐僧&quot;没那么容易
  6. MySQL中求年龄
  7. MVC异步 导入excel文件
  8. Oracle 分析函数之聚集函数(MAX、MIN、AVG和SUM)
  9. HDU_1003Max Sum 简单动归
  10. POJ2112Optimal Milking(二分法+floyd最短+网络流量)
  11. shell第二篇
  12. Android自定义ViewGroup(四、打造自己的布局容器)
  13. crontab 任务程序执行乱码的问题
  14. .net MVC +EF+VUE做回合制游戏(一)
  15. Python 判断文件是否存在
  16. Android实时取景:用SurfaceView实现
  17. openstack之~glance安装部署
  18. Linux下删除命令 硬盘空间查看... 常用命令
  19. Python中读取文件中的json串,并将其写入到Excel表格中
  20. UVa 10294 Arif in Dhaka (First Love Part 2) (Polya定理)

热门文章

  1. VS2010编译错: #error : This file requires _WIN32_WINNT to be #defined at least to 0x0403...的解决方法
  2. _bzoj1208 [HNOI2004]宠物收养所【Splay】
  3. POJ 3683 Priest John's Busiest Day
  4. Canny检测理解和Matlab实现
  5. 51nod 1134最长递增子序列
  6. 2017 JUST Programming Contest 3.0 E. The Architect Omar
  7. Java Annontation(注解)详解
  8. 数据流和ByteArray
  9. 445 Add Two Numbers II 两数相加 II
  10. sdut1283Five in a Row, Again