はじめに
Java研修コーディング問題集の第3回は 繰り返し処理(for / while) です。
ループ処理はプログラミングの根幹です。for文・while文・do-while文・拡張for文を使い分けられるようにしましょう。
難易度の見方
| マーク | 難易度 | 目安 |
|---|---|---|
| ⭐ | 基本 | 研修1週目レベル |
| ⭐⭐ | 応用 | 少し考える必要あり |
| ⭐⭐⭐ | チャレンジ | 複数の知識を組み合わせる |
問題1:1〜10の合計 ⭐
問題
for文を使って、1から10までの合計を計算して出力してください。
期待する出力
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
模範解答
public class Exercise01 {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
if (i < 10) {
System.out.print(i + " + ");
} else {
System.out.print(i);
}
}
System.out.println(" = " + sum);
}
}
ポイント: System.out.print()は改行なしで出力します。ループの最後の要素だけ表示を変えるパターンは頻出です。
問題2:九九の表 ⭐
問題
二重ループを使って、九九の表を出力してください。
期待する出力(一部)
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
...
9 18 27 36 45 54 63 72 81
ヒント
-
System.out.printf("%2d ", value)で右寄せ2桁表示ができます
模範解答
public class Exercise02 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
System.out.printf("%2d ", i * j);
}
System.out.println();
}
}
}
ポイント: printfの%2dは整数を最低2桁の幅で右寄せ表示します。二重ループでは外側のループが「行」、内側のループが「列」に対応します。
問題3:FizzBuzz ⭐⭐
問題
1から30までの数字を出力してください。ただし:
- 3の倍数のときは「Fizz」
- 5の倍数のときは「Buzz」
- 3と5の両方の倍数のときは「FizzBuzz」
期待する出力
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, FizzBuzz
模範解答
public class Exercise03 {
public static void main(String[] args) {
for (int i = 1; i <= 30; i++) {
if (i > 1) {
System.out.print(", ");
}
if (i % 15 == 0) {
System.out.print("FizzBuzz");
} else if (i % 3 == 0) {
System.out.print("Fizz");
} else if (i % 5 == 0) {
System.out.print("Buzz");
} else {
System.out.print(i);
}
}
System.out.println();
}
}
ポイント: FizzBuzzは有名なコーディング問題です。15の倍数(3と5の最小公倍数)を最初に判定する必要があります。順番を変えると正しく動きません。
問題4:while文で入力シミュレーション ⭐
問題
count = 5 から開始して、0になるまでカウントダウンするプログラムをwhile文で作成してください。
期待する出力
カウントダウン開始!
5...
4...
3...
2...
1...
発射!
模範解答
public class Exercise04 {
public static void main(String[] args) {
int count = 5;
System.out.println("カウントダウン開始!");
while (count > 0) {
System.out.println(count + "...");
count--;
}
System.out.println("発射!");
}
}
ポイント: while文はfor文と異なり、ループ変数の初期化と更新を自分で管理します。更新を忘れると無限ループになるので注意しましょう。
問題5:素数の判定 ⭐⭐
問題
2から50までの数のうち、素数だけを出力してください。
期待する出力
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
ヒント
- 素数:1とその数自身以外では割り切れない数
- 2からその数の平方根までの整数で割り切れるかチェックすると効率的
模範解答
public class Exercise05 {
public static void main(String[] args) {
for (int num = 2; num <= 50; num++) {
boolean isPrime = true;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
System.out.print(num + " ");
}
}
System.out.println();
}
}
ポイント: break文でループを途中で抜けることができます。割り切れた時点でそれ以上チェックする必要がないため、breakで効率化しています。Math.sqrt()は平方根を返します。
問題6:三角形の描画 ⭐⭐
問題
以下の3つの三角形をそれぞれ出力してください(高さ5段)。
期待する出力
=== パターン1: 左寄せ ===
*
**
***
****
*****
=== パターン2: 右寄せ ===
*
**
***
****
*****
=== パターン3: 中央 ===
*
***
*****
*******
*********
模範解答
public class Exercise06 {
public static void main(String[] args) {
int height = 5;
// パターン1: 左寄せ
System.out.println("=== パターン1: 左寄せ ===");
for (int i = 1; i <= height; i++) {
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
// パターン2: 右寄せ
System.out.println("\n=== パターン2: 右寄せ ===");
for (int i = 1; i <= height; i++) {
for (int j = 0; j < height - i; j++) {
System.out.print(" ");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
// パターン3: 中央
System.out.println("\n=== パターン3: 中央 ===");
for (int i = 1; i <= height; i++) {
for (int j = 0; j < height - i; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i - 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
ポイント: ネストしたループで「スペースの数」と「*の数」を行番号(i)から計算するのがコツです。パターンを見つけて数式に落とし込む力は、プログラミング全般で役立ちます。
問題7:do-while文 ⭐⭐
問題
サイコロを振るシミュレーションを作成してください。6が出るまで振り続け、何回目で6が出たかを出力してください。
期待する出力(例:実行ごとに変わります)
1回目: 3
2回目: 1
3回目: 5
4回目: 6
6が出ました!(4回目)
ヒント
-
(int)(Math.random() * 6) + 1で1〜6のランダムな整数を生成できます - do-while文は「最低1回は実行する」ループです
模範解答
public class Exercise07 {
public static void main(String[] args) {
int dice;
int count = 0;
do {
count++;
dice = (int) (Math.random() * 6) + 1;
System.out.println(count + "回目: " + dice);
} while (dice != 6);
System.out.println("6が出ました!(" + count + "回目)");
}
}
ポイント: do-while文は条件判定が後にあるため、ループ本体が必ず1回は実行されます。「最低1回は実行したい」場合に適しています。
問題8:breakとcontinue ⭐⭐
問題
1から20までの数字を処理してください。ただし:
- 偶数はスキップする(
continue) - 15を超えたらループを終了する(
break) - 対象の奇数を出力する
期待する出力
1 3 5 7 9 11 13 15
模範解答
public class Exercise08 {
public static void main(String[] args) {
for (int i = 1; i <= 20; i++) {
if (i > 15) {
break;
}
if (i % 2 == 0) {
continue;
}
System.out.print(i + " ");
}
System.out.println();
}
}
ポイント: breakはループ全体を抜け、continueは現在の繰り返しだけをスキップして次の繰り返しに進みます。この2つの制御文の違いを理解しておきましょう。
問題9:フィボナッチ数列 ⭐⭐⭐
問題
フィボナッチ数列の最初の15項を出力してください。
フィボナッチ数列:各項が前の2つの項の和になる数列
F(1)=1, F(2)=1, F(3)=2, F(4)=3, F(5)=5, ...
期待する出力
フィボナッチ数列(15項):
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610
模範解答
public class Exercise09 {
public static void main(String[] args) {
int n = 15;
int a = 1;
int b = 1;
System.out.println("フィボナッチ数列(" + n + "項):");
for (int i = 1; i <= n; i++) {
if (i > 1) {
System.out.print(", ");
}
System.out.print(a);
int next = a + b;
a = b;
b = next;
}
System.out.println();
}
}
ポイント: 2つの変数(aとb)を使って前の2項を保持し、順に更新していきます。変数の更新順序を間違えると正しい結果が得られないため、一時変数nextを使っています。
問題10:数当てゲーム ⭐⭐⭐
問題
1〜100のランダムな正解の数に対して、自動で数当てを行うプログラムを作成してください(二分探索アルゴリズムを使用)。
- 正解の数をランダムに生成
- 範囲の中央値で予想
- 大きければ上限を下げ、小さければ下限を上げる
- 正解するまで繰り返す
期待する出力(例:正解が73の場合)
=== 数当てゲーム(自動プレイ)===
正解の数: ???
予想 1回目: 50 → もっと大きい
予想 2回目: 75 → もっと小さい
予想 3回目: 62 → もっと大きい
予想 4回目: 68 → もっと大きい
予想 5回目: 71 → もっと大きい
予想 6回目: 73 → 正解!
73を6回で当てました!
模範解答
public class Exercise10 {
public static void main(String[] args) {
int answer = (int) (Math.random() * 100) + 1;
int low = 1;
int high = 100;
int count = 0;
int guess;
System.out.println("=== 数当てゲーム(自動プレイ)===");
System.out.println("正解の数: ???\n");
while (true) {
count++;
guess = (low + high) / 2;
System.out.print("予想 " + count + "回目: " + guess + " → ");
if (guess == answer) {
System.out.println("正解!");
break;
} else if (guess < answer) {
System.out.println("もっと大きい");
low = guess + 1;
} else {
System.out.println("もっと小さい");
high = guess - 1;
}
}
System.out.println("\n" + answer + "を" + count + "回で当てました!");
}
}
ポイント: これは 二分探索(バイナリサーチ) というアルゴリズムです。毎回範囲を半分にするため、1〜100の範囲なら最大7回で必ず正解にたどり着けます(log₂(100) ≈ 7)。実務でもデータ検索やデバッグで使う重要な考え方です。
まとめ
| 問題 | テーマ | 難易度 |
|---|---|---|
| 問題1 | 合計計算(for文) | ⭐ |
| 問題2 | 九九の表(二重ループ) | ⭐ |
| 問題3 | FizzBuzz | ⭐⭐ |
| 問題4 | カウントダウン(while文) | ⭐ |
| 問題5 | 素数判定 | ⭐⭐ |
| 問題6 | 三角形の描画 | ⭐⭐ |
| 問題7 | サイコロ(do-while文) | ⭐⭐ |
| 問題8 | break と continue | ⭐⭐ |
| 問題9 | フィボナッチ数列 | ⭐⭐⭐ |
| 問題10 | 数当てゲーム(二分探索) | ⭐⭐⭐ |
次回は 配列 のコーディング問題です!
シリーズ一覧:Java研修コーディング問題集
- 変数・データ型・演算子 編
- 条件分岐(if / switch)編
- 👉 繰り返し処理(for / while)編(本記事)
- 配列 編
- メソッド 編
- 文字列操作(String)編
- クラスとオブジェクト 編
- 継承とインターフェース 編
- 例外処理 編
- コレクションと Stream API 編
著者: @kotaro_ai_lab
AI駆動開発やテック情報を毎日発信しています。フォローお気軽にどうぞ!