[セットトップ]加算のみで減算、乗算、除算を実現する[#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を逆にするので、まず逆のコードを実現します.
乗算コード:
|a|に|b|を連続的に加算する必要があるが,a,bの正負を知らないため,まずa,bの絶対値を取得し,乗算の最後の値全体の正負を決定する必要がある.
絶対値コードは次のとおりです.
乗算全体の正負を決定するコード:
除算コード:
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