[英]How to implement division by addition?
一個面試題。
如何實現除法加法? 假設它們都是int。
我的點子
quotient * divisor + reminder == dividend
。 它是O(e^n)
,有什么更好的主意嗎? 位操作?
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
相同。
更新:
有些人可能會抱怨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
- 余數。
該算法顯然具有多項式(非指數)運行時間。
在數字算術中,我們可以將恢復和非恢復方法稱為基於加法/減法的簡單除法算法。 這些方法中的迭代次數為O(n)
(其中n
是位數)。 有像 Newton-Raphson 或倒數計算這樣的方法,它們基於乘法,其中的迭代次數為O(log n)
。 看看http://en.wikipedia.org/wiki/Division_%28digital%29
對於 int 數字,您可以使用以下邏輯:
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將是你的答案。
您可以將除法分解為其對數分量,然后計算它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.