LeetCode 29:Divide Two Integers
2015-12-05 21:59
471 查看
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题目要求:利用+,-,移位来实现除法.假设求 dividend / divisor
#include<iostream>
#include<string>
using namespace std;
//最容易的想到的办法,是把除法转化为减法,就像把乘法转化为加法一样,
//提交后发现,这个做法超时了,比如遇到2147483647/3这种时候,
//被除数很大,除数很小,基本都会超时;
//可以利用位运算,每次将除数翻倍,实现加速相减
class Solution{
public:
int divide(int dividend, int divisor){
long long a = abs((long long)dividend); //当dividend=INT_MIN时,-dividend会溢出,所以用long long
long long b = abs((long long)divisor);
long long res = 0;
if (dividend == 0 || divisor == 0) return 0;
if (dividend == INT_MIN && divisor == -1) return INT_MAX;
if (divisor == 1) return dividend;
while (a >= b){
long long c = b;
for (int i = 0; a >= c; i++, c =c << 1){
a -= c;
res += 1 << i;
}
}
return ((dividend^divisor) >> 31) ? -res : res;
//32位int右移31位后剩下的就是符号位,dividend与divisor做异或,判断相除后结果是否为负数
}
};
int main()
{
int a =-2147483648;
int b =2;
Solution sol;
int n = sol.divide(a, b);
cout << n << endl;
system("pause");
return 0;
}
If it is overflow, return MAX_INT.
题目要求:利用+,-,移位来实现除法.假设求 dividend / divisor
#include<iostream>
#include<string>
using namespace std;
//最容易的想到的办法,是把除法转化为减法,就像把乘法转化为加法一样,
//提交后发现,这个做法超时了,比如遇到2147483647/3这种时候,
//被除数很大,除数很小,基本都会超时;
//可以利用位运算,每次将除数翻倍,实现加速相减
class Solution{
public:
int divide(int dividend, int divisor){
long long a = abs((long long)dividend); //当dividend=INT_MIN时,-dividend会溢出,所以用long long
long long b = abs((long long)divisor);
long long res = 0;
if (dividend == 0 || divisor == 0) return 0;
if (dividend == INT_MIN && divisor == -1) return INT_MAX;
if (divisor == 1) return dividend;
while (a >= b){
long long c = b;
for (int i = 0; a >= c; i++, c =c << 1){
a -= c;
res += 1 << i;
}
}
return ((dividend^divisor) >> 31) ? -res : res;
//32位int右移31位后剩下的就是符号位,dividend与divisor做异或,判断相除后结果是否为负数
}
};
int main()
{
int a =-2147483648;
int b =2;
Solution sol;
int n = sol.divide(a, b);
cout << n << endl;
system("pause");
return 0;
}
相关文章推荐
- HDOJ 5590 ZYB's Biology
- 从vware里克隆出的CentOS Linux,ifconfig 没有ip地址 和重启 Device eth0 does not seem to be present
- my.ini配置文件
- 在SpringMVC利用MockMvc进行单元测试
- 【PAT】1106. Lowest Price in Supply Chain (25)
- Django 数据导入
- GPU 加速NLP任务(Theano+CUDA)
- spring mvc 框架搭建及详解
- BestCoder Round #65 (ZYB's Biology)
- ospf BMA网络类型
- C++虚析构函数
- 【PAT】1107. Social Clusters (30)
- BZOJ-3211花神游历各国 并查集+树状数组
- UIButton 解析
- Android总结篇系列:Android Service
- BZOJ-3211花神游历各国 并查集+树状数组
- 数学规律,一元二次方程求最大值。
- 电子或通信领域当前的主流技术及其谁会需求调查报告
- 面向对象六原则
- [简单实用系列] 通用adapter