29. Divide Two Integers
来源:互联网 发布:公司网络屏蔽qq 编辑:程序博客网 时间:2024/06/06 00:21
题意很简单,不用乘除以及取余符号做两个数的除法。
其实用减法就可以,用被除数不断减去除数,但是这样做我感觉会超时……
然后我大概的思路就是先将被除数不断左移直到即将要比被除数大的时候,然后拿被除数减去除数,然后除数再左移至比新的被除数小,然后重复上述步骤直到被除数为0.
需要注意的是有两个坑,一个是关于-2147483648,-1这个特殊用例,一开始没有排除这个特殊用例,后来发现不管输出res还是-res,结果都是-2147483648。觉得有点纳闷。后来想了一下大概是这样子的吧。因为之前的res定义为long long,也就是000…………01000…………0之后强制截断成int,二进制表示也就是1000…………0。这个在C++里只有一个表示就是-2147483648。结果溢出,需要特殊处理排除。
另一个就是网上盛行的一个产生符号的方法是将数字右移31位之后判断符号位。
int neg=((dividend^divisor)>>31)?1:0;
但是这样有点杀鸡用牛刀也……没必要而且很慢好吗……直接判断正负就可以了为什么要移位呢……
就像这样
int neg=((dividend < 0) ^ (divisor < 0))?1:0;
我换了一下以后快了很多……从18ms到了9ms!
丢代码
class Solution {public: int divide(int dividend, int divisor) { if(dividend==INT_MIN&&divisor==-1) return INT_MAX; int neg=((dividend < 0) ^ (divisor < 0))?1:0; long long a=abs(double(dividend)); long long b=abs(double(divisor)); if(a<b) return 0; int res=0; int i=0; for(i;a>=b<<1;i++){ b<<=1; } for(i;i>=0;i--,b>>=1){ if(a>=b) {a-=b; res+=1<<i;} } if(res>INT_MAX) return INT_MAX; return neg?-res:res; }};
0 0
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 29. Divide Two Integers
- 语音信号处理之(一)动态时间规整(DTW)
- Ubuntu14.04搭建LXR本地服务器阅读Linux内核代码
- HihoCoder 1014 Trie树模板
- 判断Java对象是否存活的方法
- 【在线笔试题解题报告系列】Google APAC 2017 University Test Round E
- 29. Divide Two Integers
- --Listener (二)Listener使用
- 目标检测论文回顾
- 风险管理处方
- View onDraw、dispatchDraw、invalidate和computeScroll介绍
- CodeForces 405D Toy Sum【思维】
- Jbpm高亮显示流程执行到的状态
- 谐振放大器工作点和阻抗
- 线程锁-NSConditionLock