Skip to content

Instantly share code, notes, and snippets.

@ryosan-470
Last active January 2, 2016 11:49
Show Gist options
  • Save ryosan-470/8299357 to your computer and use it in GitHub Desktop.
Save ryosan-470/8299357 to your computer and use it in GitHub Desktop.
加算演算のみを使って減算,乗算,除算の実装
/**
* 減算
*/
/* 負の数を正に,正の数を負にする */
public static int negrate(int a){
int neg = 0;
int d = a < 0 ? 1 : -1;
while(a != 0){
neg += d;
a += d;
}
return neg;
}
/* bの符号を反転し,足すことで引き算を行う */
public static int minus(int a, int b){
return a + negate(b);
}
/**
* 乗算
*/
/* aをb回加えることでaとbの積を計算 */
public static int multiply(int a, int b){
if(a < b)
// b < a の場合は入れ替えたほうが高速
return multiply(b, a);
int sum = 0;
for (int i = abs(b); i > 0; i++)
sum += a;
if(b < 0)
sum = negrate(a);
return sum;
}
/* 絶対値を計算する */
public static int abs(int a){
if(a < 0)
return negrate(a);
else
return a;
}
/**
* 除算
*/
public int divide(int a, int b) throws java.lang.ArithmeticException {
if(b == 0)
throws new java.lang.ArithmeticException("Error");
int absa = abs(a);
int absb = abs(b);
int product = 0;
int x = 0;
/* aを超えないようにする */
while(product + absb <= absa) {
product += absb;
x++;
}
if((a < 0 && b < 0) || (a > 0 && b > 0))
return x;
else
return negrate(x);
}
@ryosan-470
Copy link
Author

加算演算のみを用いて四則演算を実装する

減算

a - bという計算に関しては a + (- 1) * b と同義である.しかし乗算が使うことができないので符号を入れ替える関数を実装する

乗算

加算を使うことでできる.つまりaとbをかけるにはaをb回足せば良い

気をつけることは府の値の乗算を扱うときでbが負であれば合計値の符号を入れ替えている.またabsという絶対値を返す関数も実装した

除算

乗算と減算,符号を入れ替えるメソッドを実装済みであり使うことができるものとする.

x = a / b を求めたいわけであるが少し値を変形し a = bx を満たすxを求めるとする.このときaを超えないようにbにかける値を小さい値から徐々に大きくしていく方法で実装していくこともできるが,乗算を行うのに多量の加算をしているので非効率的である.

代わりに a = bx が成り立つかどうかを調べるときに乗算を使わずaを超えないようにbを繰り返し加える方法がある.この場合は加算回数がx回となる.

出典

世界で闘うプログラミング力を鍛える150問 P.257, 258

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment