两道禁止乘除法的题
假设有某种很低级的芯片,不提供乘除法指令。
问题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;
}
作者: flyinghearts
出处: http://www.cnblogs.com/flyinghearts/
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。