面试问题。
如何通过添加实现除法?假设它们都是int。
我的想法
quotient * divisor + reminder == dividend
之前加1来计算余数。 这是O(e^n)
,还有更好的想法吗?位操作?
答案 0 :(得分:4)
将m
除以n
:
int r = m;
int q = 0;
while( r >= n )
{
int k = 1;
int x = n;
int t;
while( ( t = x+x ) < r )
{
x = t;
k += k;
}
q += k;
r -= x;
}
结果为q
- 商,r
- 余数。
我的想法是x+x
与x*2
相同。
<强> UPD:强>
有些人可能会抱怨r -= x
不是补充。
那么我们可以更新算法以不使用减法:
int p = 0;
int q = 0;
while( p+n <= m )
{
int k = 1;
int x = n;
int t;
while( p + ( t = x+x ) < m )
{
x = t;
k += k;
}
q += k;
p += x;
}
结果是q
- 商。
如果我们需要余数,那么我们按以下步骤进行(p
- 上述输出):
int r = 0;
while( p < m )
{
int x = 1;
int t;
while( p + ( t = x+x ) < m )
{
x = t;
}
r += x;
p += x;
}
结果为r
- 余数。
该算法具有明显的多项式(非指数)运行时间。
答案 1 :(得分:2)
在数字算术中,我们可以将恢复和非恢复方法命名为基于加法/减法的简单除法算法。这些方法中的迭代次数为O(n)
(其中n
是位数)。有一些方法,如Newton-Raphson或倒数计算,它们基于乘法和迭代次数为O(log n)
。看看http://en.wikipedia.org/wiki/Division_%28digital%29
答案 2 :(得分:1)
对于整数,可以使用以下逻辑:
16除以5 = 3(i)
i = 1-> 5 + 0 = 5 <16
i = 2-> 5 + 5 = 10 <16
i = 3-> 5 + 5 + 5 = 15 <16
i = 4-> 5 + 5 + 5 + 5 = 20> 16
所以3是您的答案。
答案 3 :(得分:0)
您可以将除法划分为对数分量,然后计算它们。