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 
 
#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; }