zoukankan      html  css  js  c++  java
  • [leetcode]29. Divide Two Integers两整数相除

     

    Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

    Return the quotient after dividing dividend by divisor.

    The integer division should truncate toward zero.

    Example 1:

    Input: dividend = 10, divisor = 3
    Output: 3

    Example 2:

    Input: dividend = 7, divisor = -3
    Output: -2

    Note:

    • Both dividend and divisor will be 32-bit signed integers.
    • The divisor will never be 0.
    • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−  231,  231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.

    题意:

    不准乘除,不准膜。

    Solution1:用加减和位运算。

    乘法可以通过不断加法来获得

    故,除法可以通过不断减法来获得

    碎碎念:

    数学渣对这种没有算法含量,又要大量数学sense的题,好抓狂。 

    发挥文科生优势。背诵吧!!

    code

     1 class Solution {
     2     public int divide(int dividend, int divisor) {
     3         // corner case
     4         if(dividend == 0) return 0;
     5         
     6         // 当 dividend = INT_MIN,divisor = -1时,结果会溢出
     7         if (dividend == Integer.MIN_VALUE) {
     8             if (divisor == -1) return Integer.MAX_VALUE;
     9             else if (divisor < 0)
    10                 return 1 + divide( dividend - divisor, divisor);
    11             else
    12                 return - 1 + divide( dividend + divisor, divisor);
    13         }
    14         
    15         if(divisor == Integer.MIN_VALUE){
    16             return dividend == divisor ? 1 : 0;
    17         }
    18 
    19         int a = dividend > 0 ? dividend : -dividend;
    20         int b = divisor > 0 ? divisor : -divisor;
    21 
    22         int result = 0;
    23         while (a >= b) {
    24             int c = b;
    25             for (int i = 0; a >= c;) {
    26                 a -= c;
    27                 result += 1 << i;
    28                 if (c < Integer.MAX_VALUE / 2) { // prevent overflow
    29                     ++i;
    30                     c <<= 1;
    31                 }
    32             }
    33         }
    34 
    35         return ((dividend^divisor) >> 31) != 0 ? (-result) : (result);
    36     }
    37 }
  • 相关阅读:
    js 中的 EventLoop
    线程的并发工具类
    xpath获取某个节点下的全部字节点的文本
    2020中国 .NET开发者大会精彩回顾:葡萄城高性能表格技术解读
    .NET 控件集 ComponentOne V2020.0 Update3 发布,正式支持 .NET 5
    log4net配置
    TP5.1 爬虫
    pip下载慢
    TP5.1 二维码生成
    composer插件集合
  • 原文地址:https://www.cnblogs.com/liuliu5151/p/10708525.html
Copyright © 2011-2022 走看看