我试图制作一个用/符号
进行除法的函数long q(int nm1, int nm2)
{
long q = 0;
while ( num1 > num2)
{
some subtraction here
}
return q;
}
这个想法是假设输入是有序的,第一个是由第二个来划分。 这意味着从第一个减去第二个,直到第二个小于第一个数字。
我尝试了许多不同的方法来做到这一点,但出于任何理由我无法击中它。
现在我假设数字是正数并且不会将除以零返回(我可以稍后通过调用其他函数来解决)
答案 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;
}