[LeetCode]29.Divide Two Integers

【题目】

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

If it is overflow, return MAX_INT.

【分析】

不能用乘除和取模,就只能用加减和位运算。

最简单的方法就是不断的减去被除数。这种方法的迭代次数是结果的大小,即比如结果为n,算法复杂度是O(n)。但是这样会超时。

【代码】

/*********************************
*   日期:2015-01-24
*   作者:SJF0115
*   题目: 29.Divide Two Integers
*   网址:https://oj.leetcode.com/problems/divide-two-integers/
*   结果:AC
*   来源:Time Limit Exceeded
*   博客:
**********************************/
#include <iostream>
using namespace std;

class Solution {
public:
    int divide(int dividend, int divisor) {
        // 当dividend=INt_MAX时,-dividend会溢出,用long long
        long long a = dividend >= 0 ? dividend : -(long long)dividend;
        // divisor=INt_MAX时,-divisor,用long long
        long long b = divisor >= 0 ? divisor : -(long long)divisor;
        int count = 0;
        // 不断减
        while(a >= b){
            a -= b;
            count ++;
        }//while
        // 正负
        int isPositive = (dividend ^ divisor) >> 31;
        if(isPositive == 0){
            return count;
        }//if
        else{
            return -count;
        }//else
    }
};

int main(){
    Solution solution;
    int dividend = -2147483648;
    int divisor = -1;
    int result = solution.divide(dividend,divisor);
    // 输出
    cout<<result<<endl;
    return 0;
}

【分析二】

通过上面超时的例子可以总结出一点东西,做一些优化。

利用位运算每次把被除数翻倍,从而加速。

【代码二】

/*********************************
*   日期:2015-01-25
*   作者:SJF0115
*   题目: 29.Divide Two Integers
*   网址:https://oj.leetcode.com/problems/divide-two-integers/
*   结果:AC
*   来源:Time Limit Exceeded
*   博客:
**********************************/
#include <iostream>
#include <climits>
using namespace std;

class Solution {
public:
    int divide(int dividend, int divisor) {
        // 当dividend=INt_MAX时,-dividend会溢出,用long long
        long long a = dividend >= 0 ? dividend : -(long long)dividend;
        // 当divisor=INt_MAX时,-divisor会溢出,用long long
        long long b = divisor >= 0 ? divisor : -(long long)divisor;
        long long result = 0;
        // 不断减
        while(a >= b){
            long long c = b;
            for(int i = 0;a >= c;++i,c <<= 1){
                a -= c;
                result += 1 << i;
            }//for
        }//while
        // 正负
        if((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0)){
            result = -result;
        }//if
        // If it is overflow, return MAX_INT.
        if (result > INT_MAX || result < INT_MIN){
            result = INT_MAX;
        }
        return static_cast<int>(result);
    }
};

int main(){
    Solution solution;
    int dividend = -2147483648;
    int divisor = -1;
    int result = solution.divide(dividend,divisor);
    // 输出
    cout<<result<<endl;
    return 0;
}

之前忽略一个细节:If it is overflow, return MAX_INT.

2147483648 overflow 所以返回MAX_INT    2147483647

时间: 2024-10-21 15:40:53

[LeetCode]29.Divide Two Integers的相关文章

LeetCode 29 Divide Two Integers(两个整数相除)(*)

翻译 不用乘法.除法.取余操作,将两个数相除. 如果它溢出了,返回MAX_INT 原文 Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 代码 一心扑到了递归上,可惜没能写出来----烦躁至极还是找了别人的答案-- class Solution { public: int divide(int dividend, int d

Divide Two Integers

Divide two integers without using multiplication, division and mod operator. 思路: 这道题属于数值处理的题目,对于整数处理的问题,在Reverse Integer中我有提到过,比较重要的注意点在于符号和处理越界的问题.对于这道题目,因为不能用乘除法和取余运算,我们只能使用位运算和加减法.比较直接的方法是用被除数一直减去除数,直到为0.这种方法的迭代次数是结果的大小,即比如结果为n,算法复杂度是O(n). 那么有没有办法

&lt;font color=&quot;red&quot;&gt;[置顶]&lt;/font&gt;

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸,本博客会持续更新,感谢您的支持,欢迎您的关注与留言.博客有多个专栏,分别是关于 Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 . Android应用开发 ,而最近会添加的文章将主要是算法和Android,不过其它内容也会继续完善. About the Author 独立 Windows App 和

leetcode难度及面试频率

转载自:LeetCode Question Difficulty Distribution               1 Two Sum 2 5 array sort         set Two Pointers 2 Add Two Numbers 3 4 linked list Two Pointers           Math 3 Longest Substring Without Repeating Characters 3 2 string Two Pointers      

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

LeetCode总结【转】

转自:http://blog.csdn.net/lanxu_yy/article/details/17848219 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近完成了www.leetcode.com的online judge中151道算法题目.除各个题目有特殊巧妙的解法以外,大部分题目都是经典的算法或者数据结构,因此做了如下小结,具体的解题思路可以搜索我的博客:LeetCode题解 题目 算法 数据结构 注意事项 Clone Graph BFS 哈希表 Word Ladder II

[LeetCode]--371. Sum of Two Integers

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Example: Given a = 1 and b = 2, return 3. Credits: Special thanks to @fujiaozhu for adding this problem and creating all test cases. 不用+号肯定想到用Java位运算 位运算中

[LeetCode] Partition to K Equal Sum Subsets 分割K个等和的子集

Given an array of integers nums and a positive integer k, find whether it's possible to divide this array into knon-empty subsets whose sums are all equal. Example 1: Input: nums = [4, 3, 2, 3, 5, 2, 1], k = 4 Output: True Explanation: It's possible

code chef:Divide the Tangerine 橘子分块算法题解

Once Chef decided to divide the tangerine into several parts. At first, he numbered tangerine's segments from1 to n in the clockwise order starting from some segment. Then he intended to divide the fruit into several parts. In order to do it he plann