Divide two numbers,两数相除求商,不能用乘法,除法,取模运算

问题描述:求商,不能用乘法,除法,取模运算。

算法思路:不能用除法,那只能用减法,但是用减法,超时。可以用位移运算,每次除数左移,相当于2倍。

 1 public class DividTwoIntegers {
 2     public int divide(int dividend, int divisor)
 3     {
 4         if(divisor == 0) return Integer.MAX_VALUE;
 5         if(divisor == -1 && dividend == Integer.MIN_VALUE) return Integer.MAX_VALUE;
 6
 7         long pDividend = Math.abs((long)dividend);//取绝对值,放溢出转化为long
 8         long pDivisor = Math.abs((long)divisor);
 9
10         int result = 0;
11         while(pDividend >= pDivisor)
12         {
13             int count = 0;//记录位移
14             while(pDividend >= (pDivisor << count))
15             {
16                 count ++;
17             }
18             result += (1 << (count-1));
19             pDividend -= (pDivisor << (count-1));
20         }
21         if((dividend <0 && divisor < 0) || (dividend > 0 && divisor > 0))
22         {
23             return result;
24         }
25         else
26         {
27             return -result;
28         }
29     }
30     public static void main(String[] args)
31     {
32         DividTwoIntegers dt = new DividTwoIntegers();
33         int a = dt.divide(10, 3);
34         System.out.println(a);
35     }
36 }
时间: 2024-08-07 04:30:25

Divide two numbers,两数相除求商,不能用乘法,除法,取模运算的相关文章

[LintCode] Divide Two Integers 两数相除

Divide two integers without using multiplication, division and mod operator. If it is overflow, return 2147483647 Have you met this question in a real interview? Example Given dividend = 100 and divisor = 9, return 11.

每天AC系列(十三):两数相除

1 题目 LeetCode第29题,计算两数相除的商,不允许使用乘法,除法,求模运算符. 2 减法 首先判断结果是否需要加上负号,将商置为0后,被除数不断减去除数,同时商自增.最后根据是否有负号返回相应的商. boolean negative = true; if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) negative = false; dividend = d

LeetCode 29两数相除

给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: -2 说明: 被除数和除数均为 32 位有符号整数. 除数不为 0. 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [?231, 23

LeetCode 29 - 两数相除 - [位运算]

题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/ 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输入: dividend = $10$, divisor = $3$输出: $3$ 示例 2: 输入: dividend = $7$, divisor = $-

Leetcode29题两数相除

题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例一: 输入: dividend = 10, divisor = 3 输出: 3 示例二: 输入: dividend = 7, divisor = -3 输出: -2 说明: 1.被除数和除数均为 32 位有符号整数.2.除数不为 0.3.假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−23

[leetcode] 29. 两数相除

29. 两数相除 感觉是目前遇到过的最'难'过的题... 不让你用乘除法,看样子又是个涉及位运算的题. 上来打算暴力,只用减法,结果超时. 没啥想法,遂google了一下,发现可以用位运算左移操作,将divisor变大,直到divisor << 1 < dividend ,假设此时左移了k次,这时after_divisor = 2^k * origin_divisor.此时dividend再减去after_divisor,这不相当于重复了之前暴力算法中2^k次减法操作嘛. 之后可以重复寻

[CareerCup] 18.1 Add Two Numbers 两数相加

18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. 这道题让我们实现两数相加,但是不能用加号或者其他什么数学运算符号,那么我们只能回归计算机运算的本质,位操作Bit Manipulation,我们在做加法运算的时候,每位相加之后可能会有进位Carry产生,然后在下一位计算时需要加上进位一起运算,那么我们能不能将两部分拆开呢,我们来看一个例子759+674 1.

两数相除

给定两个 int 类型的数,不用乘法.除法和取模运算,计算他们的商. 输入格式 第一行依次输入被除数和除数,中间以空格间隔开. 输出格式 输出一个整数,表示它们的商. 样例输入 -1060849722 99958928 样例输出 -10 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int n,m; 5 while(cin>>n>>m){ 6 int flag=0; 7 if((n<

【LeetCode每天一题】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:             Inp