簡體   English   中英

如何實現除法加法?

[英]How to implement division by addition?

一個面試題。

如何實現除法加法? 假設它們都是int。

我的點子

  1. 向自身添加除數,直到它大於被除數。 每次迭代,保持相加前的總和結果。
  2. 商是最后一次加法之前的總和結果。 余數可以通過加 1 來計算,直到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+xx*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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM