問題
入力値1と入力値2の最大公約数を表すための文字列を返却して出力してください。
public static void main(String[] args) {
System.out.println(euclideanAlgorithm(252,105));
}
public static String euclideanAlgorithm(int num1, int num2) {
System.out.println("入力値1 : " + num1);
System.out.println("入力値2 : " + num2);
int a = 0;//二値交換のための退避領域
if ((num1 < num2) || (num2 == 0)) {
a = num1;
num1 = num2;
num2 = a;
}
//※
for (int i = 1; i != 0; ) {
i = num1 % num2;
num1 = num2;
num2 = i;
}
return "最大公約数 : " + num1;
}
//演算結果
//入力値1 : 252
//入力値2 : 105
//最大公約数 : 21
補足
- 入力値の大小関係やゼロ除算のケアをif文で行った。
- 2つの値を同時に入れ替えることができないので、一旦退避するための変数aを用意。(二値交換)
- 継続する条件を先に書く。(前判定)
→今回はカウンタのインクリメント処理を書かないものだった。(それでも動くのね!)
上記ソースコードの※以降while文にしたもの↓
int i = 1;
while (i != 0) {
i = num1 % num2;
num1 = num2;
num2 = i;
}
return "最大公約数 : " + num1;
//演算結果
//入力値1 : 252
//入力値2 : 105
//最大公約数 : 21
補足2
- for文同様、継続する条件を先に書く。(前判定)
- ループカウンタのインクリメント処理は最後に書くので特に注意!
→講師の方曰く、無限のループは冗談抜きでマズいとのこと。(あえて無限ループをさせる処理もあるらしいが) - while文の場合、カウンタの変数をブロックの外で定義する必要がある。
→つまり既に定義されている変数を継続条件に使用する際にwhile文を使うことが多らしい。