C ++函数执行除法

时间:2013-03-02 06:26:50

标签: c++

我试图制作一个用/符号

进行除法的函数
long  q(int nm1, int nm2)
{
  long q = 0;

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

}

这个想法是假设输入是有序的,第一个是由第二个来划分。 这意味着从第一个减去第二个,直到第二个小于第一个数字。

我尝试了许多不同的方法来做到这一点,但出于任何理由我无法击中它。

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

5 个答案:

答案 0 :(得分:3)

  

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

那问题是什么?

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

    return frac;
}

答案 1 :(得分:1)

您正在尝试做的是除以重复减法算法。看看Wikipedia

  

最简单的划分算法,历史上并入一个   Euclid的Elements,Book中提出的最大公约数算法   VII,命题1,发现余数给出两个正整数   仅使用减法和比较

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

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

答案 2 :(得分:1)

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

int main( int num, int den )
    {
        if(den==0)
        {
            return 1;
        }
        else
        {
            while(num!=0)
            {
                num = num - den;    
            }
        }
       return 0;         
    }

答案 3 :(得分: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.
}

答案 4 :(得分: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;
}