第29题 两个整型相除

题目如下:

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

If it is overflow, return MAX_INT.

分析:

整型相除,不使用乘除法的话,只能使用减法较为简单了。即循环使用被减数去减减数。但如果被减数很大,减数很小,则循环次数太大,效率过低。因此可以对减数进行放大,以逼近被减数。放大倍数设为2,即左移位操作。

注意:移位前先将整型转为long类型,否则移位可能溢出。

代码如下:

package T029;

public class DivideTwoIntegers {

    public static void main(String[] args) {
//divide(-2147483648,-1)
        System.out.println(divide(-2147483648,-2));
    }

    public static int divide(int dividend, int divisor) {
        long isNegative = (dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0) ? -1 : 1;
        long absDividend = Math.abs((long) dividend);
        long absDivisor = Math.abs((long) divisor);
        long result = 0;
        while(absDividend >= absDivisor){
            long tmp = absDivisor, count = 1;
            while(tmp <= absDividend){
                tmp <<= 1;
                count <<= 1;
            }
            result += count >> 1;
            absDividend -= tmp >> 1;
        }
        result = result*isNegative;
        if(result>Integer.MAX_VALUE || result <Integer.MIN_VALUE) return Integer.MAX_VALUE;
        return  (int) result;
    }

}
时间: 2024-10-11 10:54:27

第29题 两个整型相除的相关文章

Java两个整型相除结果转成浮点型

java 整型相除得到浮点型

1 public class TestFloatOrDouble { 2 3 public static void main(String[] args) { 4 Point num1 = new Point(84, 250); 5 Point num2 = new Point(21, 10); 6 7 float f1 = (num1.y - num2.y) / (num1.x - num2.x); 8 float f2 = (float) (num1.y - num2.y) / (num1.

程序实现两个整型数值的交换

题目:请写出一个小程序,实现对两个整型数值一个和b的交换 思路1:交换两个数值,最一般的做法,是创建一个临时变量临时,这个变量我们需要的不是它具体的值起到什么作用,而是要借用它所开辟出来的空间,进行被交换变量的暂时存放将一个的值存入临时,再将b存入一个中,然后再将温度里存的一个的值放入b中,即可实现一个与b的交换,如图: ? 1 #include<stdio.h> 2 3 int main() 4 { 5 6 int a = 10, b = 20; 7 int temp; 8 printf(&

Java 两个整型相加,不能用+号和其他算术运算符

Java 两个整型相加,不能用+号和其他算术运算符?用到的知识点:二进制按位异或,等值于求和.(本位)二进制按位相与再乘2,等值于求和(进位)突破口:当进位为0,加完,退出. public class Add { public int addAB(int A, int B) { // write code here while (B!=0) { int xor = A ^ B;//求和 本位 int and = (A & B)<<1;// A=xor; B=and;//进位为0,加法完

经典算法学习——交换两个整型数据

交换两个数是在编程中经常会用到的,当然我们可以用很常见的方式来实现,也可以各种稀奇古怪的方法来做.这里我们用三种比较常规的方式来做,太过古怪的方法个人觉得没有太大必要.实例代码上传至:https://github.com/chenyufeng1991/SwapFunction (1)使用指针 实现如下: // // main.c // SwapFunc // // Created by chenyufeng on 16/2/3. // Copyright © 2016年 chenyufengwe

无符号整型与有符号整型相运算规则

有符号数和无符号数运算的时候,有符号数会自动向无符号数转换 1 #include<iostream> 2 #include<ctime> 3 #include <stdio.h> 4 #include<cstring> 5 #include<cstdlib> 6 #include <map> 7 #include <string> 8 using namespace std; 9 10 #if TEST 11 int ma

求两个整型数的平均数

求两个整型平均数,简单吧!简单吗? 入门级:加.除 简单! int getAverage(int input1, int input2) { int average = (input1 + input2) / 2; return average; } 这样一个求平均数的方法拿去做大学编程题基本够用了,但是,还不够美! 进阶级:加.位 我们知道,2的指数级的乘.除运算,实质是在做移位运算,所以我们可以试着把除2变成右移1位,于是有: int getAverage(int input1, int i

查找两个整型数组的公共元素

一,问题描述 给定两个整型数组,假设一个长度为M,另一个长度为N.请找出(打印出)这两个数组中的公共元素. 二,算法分析 有两种思路求解这个问题. ①使用一个HashSet保存第一个数组中的所有元素,然后遍历第二个数组中的每个元素,判断该元素是否在HashSet中.如果在,就表明这个元素是公共元素. 此方法的时间复杂度为O(M+N),空间复杂度为O(M)[假设第一个数组长度为M,保存在HashSet中]. ②首先对两个数组进行排序.然后分别设置两个指针 i, j   初始时,分别指向两个数组的第

Php数据类型之整型详解

php中支持的数据类型 在php中主要支持8种数据类型.和3中伪类型的一个形式.8种数据类型分为以下三3大类,第一个就是我们的标量类型,标量类型它只能存储单一数据,那第二大类就是我们的复合类型,第三个呢就是特殊类型,分为这三大类,那首先我们来一类一类的来看. 在第一类中,标量类型中又分为以下四个小类,第一个就是我们的整形,那整型呢你可以通过int代表整型,或者是integer代表整型.第二个就是我们的浮点类型,可以通过float或者是double双精度浮点或者是real实数代表浮点.第三个就是我