while 文
何回まわるか、書く前には分からない
for 文は for (int i = 0; i < 5; i++) のように、回す回数を最初に書きます。5 回なら 5、配列の長さぶんなら長さの値。回数が先に決まっているから書ける形です。
ところが 123 が何桁かを数えるとき、その回数は数え終わってからでないと分かりません。i < ? の ? に入れる数が無いのです。こういう「終わる条件だけが決まっている繰り返し」のために while 文があります。
while は続ける条件だけを書く
Java
while (条件) {
// 条件が true のあいだ、ここが何度も動く
}条件を見る、true なら中身を 1 周ぶん動かす、また条件を見る。これを false になるまで続けます。500 mL の水を 200 mL ずつコップに注いでいく例だと、こうなります。
Java
int water = 500;
while (water >= 200) {
water = water - 200;
}
// water は 100 になって止まる500 から 300、100 と減っていき、100 >= 200 が false になった時点で抜けます。for のようなカウンタ変数は出てきません。ループが続くかどうかを決めている値そのものを中で動かす、というのが while の書き方です。
water = water - 200; の行を消すと、water はずっと 500 のままで条件は永遠に true です。これが無限ループです。Java Playground では 5 秒で打ち切られますが、本物のアプリなら画面が固まります。while を書いたら、条件に出てくる変数を指でなぞって、どこで変わるかを必ず確かめてください。
桁を数えるときに使う道具をひとつ。Java の int どうしの割り算は小数を切り捨てます。
Java
System.out.println(123 / 10); // 12
System.out.println(12 / 10); // 1
System.out.println(1 / 10); // 010 で割るたびに、右端の桁が 1 つ落ちていきます。
0 を渡すと、ループは一度も回らない
今回の課題は 0 も 1 桁として数える仕様です。ここが地味な落とし穴になります。while (n > 0) という条件だと、n が 0 のときは中身が一度も動きません。数えるための変数は初期値のまま返ることになります。
仕様を読むときは、境界の値を先に探す癖をつけてください。空の入力、0、最大値、マイナス。こうした値はテストが必ず突いてきます。
やってみよう
Solution.digitCount(int n) を完成させましょう。0 が来たときにどう返すかをループより前に決めておき、あとは桁が残っているあいだ while で回して、10 で割りながら回数を数えます。
書けたら 1 9 99 10000 0 を入れて、手で数えた桁数と合うか確かめてください。int の最大値 2147483647 も 10 桁として数えてくれるはずです。
要件
- クラス名は
Solution、メソッド名はdigitCount、引数はint n1 つにすること - 戻り値の型は
intで、nの桁数を返すこと - ループには 必ず
while文を使う こと (for文は使わない) n == 0のときは1を返すこと (0は1桁として扱う仕様)
入出力例
digitCount(123) → 3
digitCount(9) → 1
digitCount(10000) → 5
digitCount(0) → 1
digitCount(99) → 2
digitCount(1) → 1
digitCount(10) → 2
digitCount(100) → 3