假设有某种很低级的芯片,不提供乘除法指令。
问题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;
}
{
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;
}