两数相除(29题)

文章探讨了除法运算的本质是减法,指出常规方法在处理大数除法时可能造成时间复杂度过高。为了解决这个问题,提出了使用位运算进行优化,通过右移来快速确定能使得被除数减去整数倍除数的值,从而减少计算次数,提高算法效率。
摘要由CSDN通过智能技术生成

思路

除法本质上是在做减法。

例如10除以3=3.....1,可以将这个过程分成被除数每次减去除数:

10-3=7 >3;

7-3=4 >3;

4-3=1 <3;

被除数10减了3次除数3,因此商(result)为3,余数是1。

如果按照这个思路,每次使被除数减去除数,且result++,直到差小于除数。那么这道题的时间复杂度为O(n),会超时。

解决方法

上述思路中,时间复杂度高的主要原因是,每次都只让被除数减去一次除数(t-n,rusult++)。如果打开思路,t/n>=d。则t>=n*d,也就是说,被除数t至少可以减去n次除数d,因次可以直接使t-n*d,result+=n;

顺着这个想法,现在主要问题是确定较大值n,使t/n>=d,result+=n,t-=n*d(得到新差数t,再寻找t对应的较大值n),直到t<d,这样能更快做完减法。如果从n=1逐次尝试,时间复杂度仍然很高。

我们看到t/n,可以想到位运算:整数每右移一位相当于除以2,每左移一位相当于乘以2;假如说t是int类型数据,那么t最多可以右移31位。我们可以用位移来确定较大值n。

for(int i=31;i>=0;i--){
  if((t>>i)>=d){    //t除以2^i大于等于d,  n=2^i
    result+=(1<<i); 
    t-=(d<<i); 
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值