【算法设计作业】week5

来源:互联网 发布:ubuntu jdk 1.7 下载 编辑:程序博客网 时间:2024/06/05 03:04

1.Divide Two Integers

来源:https://leetcode.com/problems/divide-two-integers/description/

题意

给出两个int数a,b,要求计算他们的商,不能使用乘、除、取模。

思路

  1. 很直接想法按照除法的定义,当a,b都大于0时,a不断减b,直到余数比b小,记录一共减了多少次,就是所求的答案。但是这样会超时。
  2. 这是参考答案的思路:我们可以不1个1个除数地除,而可以除数的指数倍来除。比如说,15/3,我们发现 15 > 3, 于是尝试 2*3=6, 发现15 > 6, 于是继续尝试 4 * 3 = 12,发现15 > 12,继续尝试12 * 2 = 24。 但是15 < 24,因而,15 - 12 = 3, 是余数,记录此时减掉了4个3。对余数3继续上述过程,需要减去1个3。总共加起来减去了4+1 = 5个3, 结果就是3.

代码

class Solution {public:    int divide(int dividend, int divisor) {        if(divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX;        int sign = ((dividend < 0) ^ (divisor < 0)) ? -1: 1;        long long dvd = labs(dividend);        long long dvs = labs(divisor);        int res = 0;        while(dvd >= dvs) {            long long temp = dvs, multiple = 1;            while(dvd >= (temp << 1)) {                temp <<= 1;                multiple <<= 1;            }            dvd -= temp;            res += multiple;        }        return sign == 1? res: -res;    }};
原创粉丝点击