29. Divide Two Integers
2016-03-22 00:11
435 查看
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
Subscribe to see which companies asked this questionc
思路:
首先,最基本的方法是将被除数减去除数,直至被除数小于除数,相减的次数就是商的大小。但是这种方法超时。
在上述方案的基础上,做出适当改进。将除数不断进行左移操作,即乘以2,直至除数大于或者等于被除数。记录左移的次数,即除数放大的倍数,记为temp。然后将被除数与放大之后的除数做减法运算,其效果相当于减去了temp个原来的除数。将temp累加到计数器上。重复这个循环,直至被除数小于除数。最终计数器的值就是商。
注意一点,对于溢出题目给出了超出上限,直接返回上限值。这里需要注意abs(INT_MIN)=INT_MAX+1 .
If it is overflow, return MAX_INT.
Subscribe to see which companies asked this questionc
思路:
首先,最基本的方法是将被除数减去除数,直至被除数小于除数,相减的次数就是商的大小。但是这种方法超时。
在上述方案的基础上,做出适当改进。将除数不断进行左移操作,即乘以2,直至除数大于或者等于被除数。记录左移的次数,即除数放大的倍数,记为temp。然后将被除数与放大之后的除数做减法运算,其效果相当于减去了temp个原来的除数。将temp累加到计数器上。重复这个循环,直至被除数小于除数。最终计数器的值就是商。
注意一点,对于溢出题目给出了超出上限,直接返回上限值。这里需要注意abs(INT_MIN)=INT_MAX+1 .
class Solution { public: int divide(int dividend, int divisor) { if(dividend==0) return 0; long long m= abs((long long) dividend); long long n =abs((long long) divisor); long long ret=0; //是否商是负数 bool flag =(dividend >0) ^(divisor>0); while (m>=n){ long long temp=1; long long a= n; while ((a<<1)<m){ a=a<<1; temp=temp<<1; } ret+=temp; m-=a; } if(!flag){ if(ret>=INT_MAX) return INT_MAX; return ret; } if(ret >INT_MAX) return INT_MIN; return -ret; } };
相关文章推荐
- 逆波兰计算器加强版:多项式
- R语言发email
- BZOJ-1010 玩具装箱toy (斜率优化)
- Oracle Library Cache
- Library cachelatches gone in Oracle 11g
- 20160322-Java一些漏洞点的笔记
- [Java 内存]Java内存组成
- Settings for Oracle Library Cache Reload andLibrary Cache Hit Ratios
- understanding the Oracle Library Cache Pin WaitEvent
- 欢迎使用CSDN-markdown编辑器
- mac下使用github
- 根据IP将列表分组
- Investigate the Oracle Library CacheHit Ratio
- Library cachepin (%)
- Swift 网络请求, 图片加载, tableView, collectionView, webView(八)
- Oracle Concepts - Disk IO and the Shared Pool
- Codeforces 632C - The Smallest String Concatenation
- 闭包(Closure)
- AIDL在android系统中的作用
- Top Oracle shared pool scripts