0

我试图制作一个没有 / 符号的除法函数

long  q(int nm1, int nm2)
{
  long q = 0;

   while ( num1 > num2)
    {
    some subtraction here    
    }
return q;

}

这个想法是假设输入是有序的,第一个要除以第二个。这意味着从第一个数字中减去第二个数字,直到第二个数字小于第一个数字。

我尝试了许多不同的方法来做到这一点,但出于某种原因,我无法做到这一点。

现在我假设这个数字是正数并且不会返回除以零(我可以稍后通过调用我的其他函数来解决这个问题)

4

5 回答 5

3

这意味着从第一个数字中减去第二个数字,直到第二个数字小于第一个数字。

那有什么问题呢?

int div(int num, int den)
{
    int frac;
    for (frac = 0; num >= den; num -= den, frac++)
        ;

    return frac;
}
于 2013-03-02T06:30:23.833 回答
1

你原来的帖子试图做的是通过重复减法算法进行除法。看看维基百科

最简单的除法算法,历史上并入欧几里得元素,第 VII 卷,命题 1 中提出的最大公约数算法,仅使用减法和比较来找到给定两个正整数的余数

while  N ≥ D do
  N := N - D
end
return N

只需在您的 while 循环中添加一个计数器来跟踪迭代次数(这是您想要返回的),并且在您的循环之后 N 将包含您的余数(如果它当然不是 0)。

于 2013-03-02T07:23:26.647 回答
1

仅当 num 和 den 是整数值时,此代码才有效。

int main( int num, int den )
    {
        if(den==0)
        {
            return 1;
        }
        else
        {
            while(num!=0)
            {
                num = num - den;    
            }
        }
       return 0;         
    }
于 2013-03-02T09:46:35.330 回答
0

只是稍微改进上述答案。使用模数

long div(int num, int den)
{
    int frac;
    int num2 = num;

    for (frac = 0; num2 >= den; num2 -= den, frac++)
        ;
// i needed the original num and den. 

  return ( (long) frac )+( num % den );

// casts frac to long then adds the modulus remainder of the values.
}
于 2013-03-02T06:57:23.397 回答
0

只是一点优化:您不希望输入值具有线性时间复杂度

int div(int num, int den)
{
    int result = 0;
    int i;
    long long x;
    long long y;
    if (num < 0) return -div(-num, den);
    if (den < 0) return -div(num, den);
    if (num < den) return 0;

    x = num;
    y = den;
    i = 0;
    while((i < 32) && (x > (y << (i+1)))) i++;
    for(;i>0; i++)
    {
       if (x > (y << i))
       {
           x -= y;
           result += 1 << i; 
       }
    } 

    return result;
}
于 2013-03-02T11:25:56.153 回答