如何通过添加实现除法?

时间:2011-12-31 17:57:43

标签: c++ algorithm division addition

面试问题。

如何通过添加实现除法?假设它们都是int。

我的想法

  1. 将除数添加到自身,直到它大于被除数。 每次迭代,在添加之前保留总和结果。
  2. 商是上次添加前的总和结果。可以通过在quotient * divisor + reminder == dividend之前加1来计算余数。
  3. 这是O(e^n),还有更好的想法吗?位操作?

4 个答案:

答案 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+xx*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)

您可以将除法划分为对数分量,然后计算它们。