[LeetCode-29] Divide Two Integers(两个整数相除,不用乘除取余算术符)
来源:互联网 发布:cf专业刷枪软件 编辑:程序博客网 时间:2024/05/29 18:12
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
采用减法代替除法
代码如下:
/*方法一、用减法代替除法*//**dividend: 被除数divisor: 除数**/int divide(int dividend, int divisor){ /*1.异常处理*/ if(divisor == 0) { return 0; } int MAXINT = 2147483647; int MININT = -2147483648; long long divid = (long long)dividend;//考虑对最大最小整数取模的情况 long long divi = (long long)divisor; /*避免多次计算,直接返回被除数*/ if(divi == 1) { return (int)divid; } if(divi == -1) { /*溢出处理-2147483648/-1 = 2147483647 而不是2147483648*/ if (divid <= -MININT) { return MAXINT; } return (int)(-dividend); } bool ispositive = true; /*2.负数处理*/ if(divid<0) { divid = -divid; if(divi < 0) { divi = -divi; } else { ispositive = false; } } else if(divi<0) { divi = -divi; ispositive = false; } bool ispositive = true; /*2.负数处理*/ if(dividend<0) { dividend = -dividend; if(divisor<0) { divisor = -divisor; } else { ispositive = false; } } else if(divisor<0) { divisor = -divisor; ispositive = false; } /*3.用减法代替除法*/ while(dividend >= divisor) { dividend -= divisor; res++; } if(!ispositive) { res = -res; } return res;}
提交结果是超时。
方法二、采用减法和移位来代替除法(通过)
算法思想如下:分析:题目意思很容易理解,就是不用乘除法和模运算求来做除法,很容易想到的一个方法是一直做减法,然后计数,但是提交之后显示超时,在网上找到一种解法,利用位运算,意思是任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+…+a_n*2^n。基于以上这个公式以及左移一位相当于乘以2,我们先让除数左移直到大于被除数之前得到一个最大的基n的值,说明被除数中至少包含2^n个除数,然后减去这个基数,再依次找到n-1,…,1的值。将所有的基数相加即可得到结果。
/*方法二,用减法和移位代替除法*/int divide(int dividend, int divisor){ /*1.异常处理*/ if(divisor == 0) { return 0; } int MAXINT = 2147483647; int MININT = -2147483648; long long divid = (long long)dividend;//考虑对最大最小整数取模的情况 long long divi = (long long)divisor; /*避免多次计算,直接返回被除数*/ if(divi == 1) { return (int)divid; } if(divi == -1) { /*溢出处理-2147483648/-1 = 2147483647 而不是2147483648*/ if (divid <= -MININT) { return MAXINT; } return (int)(-dividend); } bool ispositive = true;// printf("[%d] divid %lld!\n",__LINE__,divid);// printf("[%d] divi %lld!\n",__LINE__,divi); /*2.负数处理*/ if(divid<0) { divid = -divid; if(divi < 0) { divi = -divi; } else { ispositive = false; } } else if(divi<0) { divi = -divi; ispositive = false; } long long res = 0; long long cnt = 1; long long temp = 0;#if 1 while(divi <= divid) { cnt = 1; /*2^n 次方*/ temp = divi; /*3.找到大于被除数的基数*/ while(temp <= divid) { temp <<= 1; cnt <<= 1; } res += (cnt>>1); /*4.减去基数前一个数*/ divid -= (temp>>1); }#endif if(!ispositive) { res = -res; } return res;}
0 0
- [LeetCode-29] Divide Two Integers(两个整数相除,不用乘除取余算术符)
- leetcode——Divide Two Integers 不用乘除取余操作求除法(AC)
- leetcode 实现两个int整数相除(不用乘除,取余)
- LeetCode 29 Divide Two Integers(两个整数相除)(*)
- Divide Two Integers 两个整数相除
- 5.divide-two-integers(两个整数相除)
- Leetcode #29 Divide Two Integers 整数相除 解题报告
- leetcode 29 Divide Two Integers(整数相除)
- LeetCode OJ 之 Divide Two Integers (两个整数相除)
- 【LeetCode-面试算法经典-Java实现】【029-Divide Two Integers(两个整数相除)】
- LeetCode | Divide Two Integers(两个数相除)
- Leetcode刷题记——29. Divide Two Integers(整数相除Divide two integers without using multiplication, division)
- 不用乘除及取模操作实现两个整数的相除
- [LeeCode]-Divide Two Integers 不用乘除的除法运算
- leetCode 29.Divide Two Integers (两整数相除) 解题思路和方法
- leetcode 两个数相除,不用乘除和mode
- LeetCode (31) Divide two integers (不使用 *, /, mod 求两个数相除结果)
- Divide Two Integers 两数相除@LeetCode
- OC学习笔记
- winscp 上传文件发生错误码 4的问题
- C++Primer第五版 7.1.1节练习
- 黑马程序员-------OC----self总结
- Swift下的函数
- [LeetCode-29] Divide Two Integers(两个整数相除,不用乘除取余算术符)
- soapui 自动化教程(四)
- mysql批量插入数据方法
- POJ 1785 Binary Search Heap Construction 笛卡尔树
- Grunt、webpack个人笔记
- 单词缩写
- Java数据结构与算法之数组(一)
- 文章标题
- Cookie的主要属性及Java实现