Divide Two Integers

本文介绍了一种在不使用乘法、除法和取余运算的情况下实现整数除法的方法,通过逐步减法来计算商。讨论了各种特殊情况,如除数为0或1的情况,并给出了详细的算法步骤及C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Problem

Divide two integers without using multiplication, division and mod operator.If it is overflow, return MAX_INT.

2.Pre-Thought

题目要求不能使用乘法、除法和求余运算符,只能使用+、-运算符。

除法可理解为被除数是由几个除数相加得到的,比如8 / 2 = 4,可写成8 = 2 + 2 + 2 + 2; 7 / 2 = 2 + 2 + 2 + 1,商为3.

那么可以用减法不断地用除数去减被除数,一直到被除数小于除数为止。

3.Example

3.1普通模式: dividend = 70, divisor = 2

1) 70 - 2 = 68         -----> factor = 1,

  minus = 2, 

res = 0 + factor = 1

2) 68 - (2 + 2) = 66 ----->factor = factor + factor= 2,

minus = minus + minus = 4, 

res = res + factor = 3

3) 66 - (4 + 4) = 54 -----> factor = factor + factor = 4,

minus = minus + minus = 8, 

res = res + factor =7

... ...

3.2特殊情形1: divisor = 0

溢出,输出整数最大值INT_MAX(头文件是limits.h)

3.3特殊情形2: divisor = 1

直接输出dividend

3.3特殊情形3: divisor = -1

1)如果dividend == INT_MIN,则溢出,因为最大整数的绝对值总比最小整数绝对值小1.
此时,直接输出INT_MAX,表示结果溢出。

(普及知识: "INT_MIN"和"INT_MAX"是在头文件<limits.h>中定义的,在32位操作系统中,INT_MAX为2^32-1=2147483647.INT_MIN 为-2^32=-2147483648.)按照数学知识,(-2^32)/(-1)应该为2^32,但是2^32这个数超出了正数的表示范围.)

2)否则,输出dividend的相反数,也即0 -  dividend

3.4特殊情形4: dividend < 0, divisor < 0

1)如果divisor == INT_MIN,则结果必须为0.
2)否则,如果dividend == INT_MIN, abs(dividend) == dividend.也即最小整数的abs绝对值仍然为它本身,这时,只能对
divident先赋值为INT_MAX,并进行第一步减法后,加上1.(比如abs(-8) = -8,如果只有4位)。

4.Algorithm

1)对dividend和divisor均取绝对值,一方便进行正整数相减的工作;

2)首先对第3步考虑到的特殊情形,进行特殊处理;

3)对普通模式进行处理时需要注意的两点是:

a)minus + minus有可能溢出,需要进行判定。如果minus + minus < 0,则溢出。需要进行第二次外层while循环,对factor和minus 重新初始化;
b)当dividend - minus < 0时,需要进行第二次外层while循环,对factor和minus重新初始化;

5.Coding

#include<iostream>
#include<cmath> // import abs
#include<limits.h>
using namespace std;

class Solution
{
public:
    int divide(int dividend, int divisor)
    {
        int MAX_INT = INT_MAX;
        // 如果除数为0,那么就输出MAX_INT
        if(divisor == 0)
            return MAX_INT;
        // 如果除数为1,那么就输出dividend
        if(divisor == 1)
            return dividend;
        // 如果除数为-1,那么就输出-dividend
        if(divisor == -1)
        {
            if(dividend == INT_MIN)
                return MAX_INT;
            return 0 - dividend;
        }

        // 求取除数和被除数中负数的个数
        int minus = 0;
        if(dividend < 0)
            minus += 1;
        if(divisor < 0)
            minus += 1;
        dividend = abs(dividend);
        divisor = abs(divisor);
        int res = 0;

        // 处理INT_MIN的除法(divisor=INT_MIN),因为abs(INT_MIN)=INT_MIN
        if(divisor == INT_MIN)
        {
            if(dividend == INT_MIN)
                return 1;
            else
                return 0;
        }
        bool flag_min = false;
        if(dividend == INT_MIN)
        {
            flag_min = true;
            dividend = INT_MAX;
        }
        // 如果被除数小于除数,则输出0
        if(dividend < divisor)
            return 0;
        // 如果被除数不小于除数,则做减法操作
        while(dividend >= divisor)
        {
            int factor = 1; 
            res += factor;
            int minus_current = divisor; 
            dividend -= minus_current; 
            if(flag_min)
            {
                flag_min = false;
                dividend += 1;
            }
            while(true) 
            {
                int minus_temp = minus_current;
                minus_current += minus_current;
                if(minus_temp >= 0 && minus_current < 0)
                    break; 
                int temp = dividend - minus_current;
                if(temp < 0)
                    break;
                else
                {
                    dividend = dividend - minus_current;
                    if(flag_min)
                    {
                        flag_min = false;
                        dividend += 1;
                    }
                    res = res + factor + factor;
                    factor = factor + factor;
                }
            };
        }

        // 如果商应该是负数,那么就对结果取相反数
        bool flag = minus & 1;
        if(flag)
            res = 0 - res;
        return res;
    }
};

int main()
{
    int a = INT_MIN; 
    int b = a + 1; 
    int res = 0;
    Solution sol;
    res = sol.divide(a, b);
    cout<<res<<endl;
    return 0;
}









下面是一个Java程序,名为ArithmeticT1,可以接受三个命令行参数:两个整数和一个算术运算符(+,-,*,/)。程序将对这两个整数执行相应的操作,并显示结果。请注意,您需要使用异常处理程序(try-catch语句)来处理非数字输入作为操作数(两个整数中的一个) - 如果任何操作数是非数字,则程序将终止,并在退出前显示带有错误操作数输入的消息。此外,程序还应处理运算符的错误输入。 ``` public class ArithmeticT1 { public static void main(String[] args) { if(args.length != 3) { System.out.println("Usage: java ArithmeticT1 operand1 operator operand2"); System.exit(1); } int operand1 = 0; int operand2 = 0; int result = 0; try { operand1 = Integer.parseInt(args[0]); operand2 = Integer.parseInt(args[2]); } catch (NumberFormatException ex) { System.out.println("Wrong operand input"); System.exit(1); } switch (args[1]) { case "+": result = operand1 + operand2; break; case "-": result = operand1 - operand2; break; case "*": result = operand1 * operand2; break; case "/": if (operand2 == 0) { System.out.println("Cannot divide by zero"); System.exit(1); } result = operand1 / operand2; break; default: System.out.println("Wrong operator input"); System.exit(1); } System.out.println(operand1 + " " + args[1] + " " + operand2 + " = " + result); } } ``` 这个程序首先检查是否有三个命令行参数。如果不是,则显示用法消息并退出程序。程序然后尝试将第一个和第三个参数解析为整数。如果任何一个参数不是整数,则显示错误消息并退出程序。如果两个参数都是整数,则根据第二个参数执行相应的算术运算。如果第二个参数是除法运算符,程序还会检查第二个操作数是否为零。如果是,则显示错误消息并退出程序。最后,程序将显示算术表达式和结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值