Divide Two Integers C#

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

If it is overflow, return MAX_INT.

题意:实现一个除法,不能用division,mod,multiplication这三种运算。当然了能用division,写个毛线啊。这些都不能用,运算里面只有加法了,其实计算机所有的运算都是靠加法实现的,为什么?CPU只有加法器嘛。

解析:首先考虑特殊情况,int类型的上下限问题,除零问题,以及除数是1或-1的问题,这些都有可能导致overflow。

其次,考虑到只能用加法,那每次加多少呢?如果一次加一倍的divisor,算法效率太慢,需要加速,每次加2的n次幂倍的divisor,实现很简单,sum= divisor,每次循环sum+=sum就可以实现,再用另一个计数器 count=1,每次循环同样的 count+=count;

考虑到加法的过程中会出现overflow的情况,因此中间变量最好使用long类型,并将所有的负数转化成正数运算,还有结果的正负号问题也要在开始的时候判断出来。

代码实现:

 public class Solution
    {
        public int Divide(int dividend, int divisor)
        {
            if (divisor == 0)
                return 2147483647;
            else if (dividend == -2147483648 && divisor == -1)//特殊情况,结果会溢出。
                return 2147483647;
            else if (divisor == 1 || divisor == -1)//可以不单独拿出来,但是可以直接知道结果,为啥要算呢。
                return divisor == 1 ? dividend : -dividend;
            int flag = (dividend ^ divisor) >> 31;//记录结果的符号
            long _dividend = (long)(dividend);
            long _divisor = (long)(divisor);
            _dividend = Math.Abs(_dividend);
            _divisor = Math.Abs(_divisor);//将数据转化成正数long类型
            long sum = _divisor;
            long remainder = _dividend;//循环结束标志,当小于divisor时循环结束
            long ret = 0;
            while (remainder >= _divisor)
            {
                long count = 1;//计数器
                while ((sum + sum) <= remainder)
                {
                    sum = sum << 1;
                    count = count << 1;
                }
                ret += count;
                remainder -= sum;
                sum = _divisor;
            }
            return flag == 0 ? (int)ret : (int)-ret;
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值