如何实现加法除法

How to implement division by addition?

本文关键字:除法 实现 何实现      更新时间:2023-10-16

面试问题。

如何实现加法除法?假设它们都是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 - quotient。

如果需要余数,则按以下步骤进行(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

将除法分解为对数分量,然后计算它们。

对于整型数,可以使用以下逻辑:



i = 1→5+0 = 5 <16
我= 2→5+5 = 10 <16
我= 3→5+5+5 = 15 <16
我= 4→5+5+5+5 = 20>16

所以你的答案是3。