29. Divide Two Integers

题目要求:给定两个整数,要求不用乘除法和取模运算,计算出a/b的值,当结果越界的时候输出INT最大值

解题思路:

用两个数组暂存b对应的倍数,和相应的系数
这里写图片描述

long long ABS(long long a)
{
    return a > 0 ? a : -a;
}
int divide(int dividend, int divisor)
{
    if (divisor == 0 || (dividend == INT_MIN && divisor == -1))
        return INT_MAX;
    long long a = ABS((long long)dividend);
    long long b = ABS((long long)divisor);
    long long sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
    long long res=0;
    long long tmp[33], times[33];
    //第一组数据填充
    tmp[0] = b;
    times[0] = 1;
    int index = 0;
    //一直填充到临界大于a的位置
    while (a >= tmp[index] && index < 33)
    {
        index++;
        tmp[index] = tmp[index - 1] + tmp[index - 1];
        times[index] = times[index - 1] + times[index - 1];
    }
    //遍历填充数据
    for (int j = index - 1; j >= 0; j--)
    {
        while (a >= tmp[j])
        {
            res += times[j];
            a -= tmp[j];
        }       
    }
    res = (sign == 1) ? res : -res;
    return (int)res;
}

这里一直无法解决的一个问题,通过重写了取绝对值方法而生效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值