两道禁止乘除法的题

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

 问题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;
}

 

posted @ 2011-05-08 21:42  flyinghearts  阅读(317)  评论(0编辑  收藏  举报