数据结构与算法练习52

两数相除

在这里插入图片描述

解题思路:

位运算,递归。m/n就是找m中有多少个n,首先可以用暴力法,每次减一个n,但是这样耗时太久。所以可以优化一下,只要还能除,那么m一定是n的2的x次方倍,再m=m-n*2^x计算,每次递归直到m<n,把所有倍数加起来就是除法结果。

代码:

        public int Divide(int dividend, int divisor)
        {
            int flag1 = dividend > 0 ? -1 : 1;
            int flag2 = divisor > 0 ? -1 : 1;//为了防止溢出,转换成负数来计算,不过要保存下来最终结果的符号。
            int flag = -1 * flag1 * flag2;
            int result = search(flag1 * dividend, flag2 * divisor);//通过递归得到结果。
            if (result == int.MinValue && flag == -1)//溢出的情况。只有最终结果为int.MinValue,且符号为正时溢出。
                return int.MaxValue;
            return result * flag;
        }//主函数。
        public int search(int m,int n)
        {
            if (m > n)
                return 0;//终止条件。
            int k = -1;//用来记每一步倍数。
            int h = n;
            while(m<h&&m-h<h)
            {
                k=k << 1;
                h=h << 1;
            }//递归中每一步要做的。
            return k + search(m - h, n);//返回值。
        }

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值