[セットトップ]加算のみで減算、乗算、除算を実現する[#68]

1841 ワード

質問:
2つの整数aとbをあげて、加算だけを使って、a-b、a*b、a/bを実現します.
分析:
減算については,a−b=a+(-1)*bであるため,言い換えれば,bの逆数を得るだけで加算でa−bを実現できる.
乗算については、a*bは|a|に対して|b|を二次加算したり、|b|に対して|a|を二次加算したりすることに相当するが、ここではaとbが負の数である可能性があることに注意しなければならない.
除算については、a/bは|b|に自分を加えさせ、|b|に自分が|a|より大きい場合、カウンタが停止するカウンタを設定します.しかし,ここでは残数(除くことができない)を持つ可能性があり,ここでは,四捨五入の方法を考えていると仮定する.
減算コード:
bを逆にするので、まず逆のコードを実現します.
public static int negate(int b) {
	int value = (b < 0 ? 1 : -1);
	int negate = 0;
	while (b!= 0) {
		negate += value;
		b += value;
	}
	return negate;
}
bをbに反転させると、a+negate(b)はa−bを実現する.
public static int substract(int a, int b) {
	return a + negate(b);
}

乗算コード:
|a|に|b|を連続的に加算する必要があるが,a,bの正負を知らないため,まずa,bの絶対値を取得し,乗算の最後の値全体の正負を決定する必要がある.
絶対値コードは次のとおりです.
public int abs(int value) {
	if (value >= 0 ) return value;
	else return negate(value);
}

乗算全体の正負を決定するコード:
public static boolean positive(int a, int b) {
	if ((a > 0 && b > 0) || (a < 0 && b < 0)) return true;
	else return false;
}
乗算を実現するコード:
public static int times(int a, int b) {
	if (abs(a) > abs(b)) return times(b, a); //faster
	int result = 0;
	for (int i = 1; i <= abs(a); i++) {
		result += abs(b);
	}
	if (positive(a, b) == true) return result;
	else return negate(result);
}

除算コード:
public static int divide(int a, int b) {
	int count = 0;
	for(int i = abs(a); i >= abs(b); i -= abs(b)) {
		count++;
	}
	int remaining = substract(abs(a), times(abs(b), count));
	if (times(remaining, 2) >= abs(b)) {
		count++;
	}
	if (positive(a, b) == true) return count;
	else return negate(count);
}
転載出典:blog.csdn.net/beiyeqingteng