2つの整数の除算を実現し、除算と乗数は使用できません.
2つの整数aとbについて、a/bを求めると、1から結果resultを列挙し、result*b<=aを満たす最大resultを求めることができる.
これは実行可能なアルゴリズムであるが,効率は比較的低く,実際にresultを列挙するとresultを2倍に増やし,result*b<=aを満たす
最大result、次にaをresult*bから減算し、次に残数aがbより小さくなるまで残数aを再反復する.
たとえば、29/5を計算するプロセスは、次のとおりです.
(1)
a = 29, b = 5
b*i<=aを満たす最大iを見つけ、順次計算する.
b*1 = 5, b*2 = 10, b*4 = 20
だから最大のi=4、それからaをb*4を減らして、resultは4を加えます
a = a - b*4 = 9
result = result + 4 = 4
ステップ(2)に進む
(2)
a = 9, b = 5
b*i<=aを満たす最大iを見つけ、順次計算する.
b*1 = 5
だから最大のi=1、それからaをb*1を減らして、resultは1をプラスします
a = a - b*1 = 4
result = result + 1 = 5
ステップ(3)
(3)
a=4,b=5,a
これは実行可能なアルゴリズムであるが,効率は比較的低く,実際にresultを列挙するとresultを2倍に増やし,result*b<=aを満たす
最大result、次にaをresult*bから減算し、次に残数aがbより小さくなるまで残数aを再反復する.
たとえば、29/5を計算するプロセスは、次のとおりです.
(1)
a = 29, b = 5
b*i<=aを満たす最大iを見つけ、順次計算する.
b*1 = 5, b*2 = 10, b*4 = 20
だから最大のi=4、それからaをb*4を減らして、resultは4を加えます
a = a - b*4 = 9
result = result + 4 = 4
ステップ(2)に進む
(2)
a = 9, b = 5
b*i<=aを満たす最大iを見つけ、順次計算する.
b*1 = 5
だから最大のi=1、それからaをb*1を減らして、resultは1をプラスします
a = a - b*1 = 4
result = result + 1 = 5
ステップ(3)
(3)
a=4,b=5,a
#include <stdio.h>
#include <stdlib.h>
#define MASK 0x80000000
int div_int(int x, int y)
{
unsigned int flag, a, b, result, i;
flag = (x & MASK) ^ (y & MASK); /* */
a = x = abs(x);
b = y = abs(y);
result = 0;
if (b == 0) {
printf("
");
exit(0);
}
for (; a >= b; a -= b, b = y) {
for (i = 1; b <= a; b <<= 1, i <<= 1);
b >>= 1; i >>= 1;
result += i;
}
if (flag) {
return -result;
}
return result;
}
int main()
{
int a = -64;
int b = 4;
printf("%d
", div_int(a,b));
return 0;
}