两道禁止乘除法的题

本文探讨了在不支持乘除法指令的低级芯片上实现快速加法和求模运算的方法。对于从1加到N的问题,采用位操作来提高效率;对于求3的余数问题,通过不断拆分和重组数值来简化计算。

 假设有某种很低级的芯片,不提供乘除法指令。

 问题1  计算从1加到N的和 (即 1 + 2 + 3 + ... + n)。

 问题2  求3的余数。

 

对问题1,直接从1加到N,效率太差了,肯定不能这么干(小高斯都知道用乘法) 。既然不能用乘除法,那只好用加法来模拟了。

             m * n,可以看做是 n个m相加,可以看做是 m,2*m, 4*m, 8*m, 16*m,... 中的几个相加。

对问题2   设 n = 4 * a + b,则 n ≡  a + b (mod 3)

 

 

unsigned sum(unsigned n)
{
  unsigned min_v, max_v, ret 
=   0 ;
  
if  (n  &   1 ){ max_v  =  n; min_v  =  (n  +   1 >>   1 ;}
  
else  { max_v  =  n  +   1 ; min_v  =  n  >>   1 ; }

  
while  (min_v  !=   0 ){
    
if  (min_v  &   1 ) ret  +=  max_v;
    max_v 
<<=   1 ;
    min_v 
>>=   1 ;
  }
  
return  ret;
}

unsigned mod3(unsigned num)
{
  
while  (num  >   3 ){
    num
=  (num  &   3 +  (num  >>   2 );
  }
  
if  (num  ==   3 ) num  =   0 ;
  
return  num;
}

 

转载于:https://www.cnblogs.com/flyinghearts/archive/2011/05/08/2040598.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值