Skip to content
Playground

演習: 条件分岐と繰り返し

各問題のコードは、Main クラスの main メソッドの中に書く前提です。

変数 n の値が正・負・ゼロのいずれかを判定して出力してください。

int n = -5;

出力例(n=-5 のとき):

n07 に変えても正しく判定されることを確認してください。

ヒント

if / else if / else で3つの場合を表します。

信号の色を表す文字を受け取り、対応する指示を出力してください。switch 式(アロー記法)を使ってください。

char light = 'r';
入力出力
'r'止まれ
'y'注意
'g'進め
その他不明

出力例(light=‘r’ のとき):

指示: 止まれ
ヒント

switch 式(アロー記法)は値を返せます。基本構文:

変数の型 result = switch (対象) {
case 値1 -> 結果1;
case 値2 -> 結果2;
default -> その他;
};

char のように値の種類が多い型では、すべての可能性を網羅していないとコンパイルエラーになるため、default が必須です。

4-C. 曜日の種類判定(switch 式・複数 case)

Section titled “4-C. 曜日の種類判定(switch 式・複数 case)”

曜日を表す文字列を受け取り、平日か週末かを出力してください。switch 式の複数 case のまとめ書きを使ってください。

String day = "";
入力出力
"月", "火", "水", "木", "金"平日
"土", "日"週末
その他不明

出力例(day=“月” のとき):

平日
ヒント

switch 式では、複数の値をカンマで区切って1つの case にまとめられます。

case 値1, 値2, 値3 -> 結果;

Stringswitch の対象にできます(比較は equals で行われます)。

年と月を受け取り、その月の日数を出力してください。year は西暦の正の整数、month は 1〜12 の整数を入力する想定です。

int year = 2024;
int month = 2;

ルール:

  • 1, 3, 5, 7, 8, 10, 12月 → 31日
  • 4, 6, 9, 11月 → 30日
  • 2月 → うるう年なら29日、そうでなければ28日

うるう年の条件:

  • 4で割り切れる年はうるう年
  • ただし、100で割り切れる年はうるう年ではない
  • ただし、400で割り切れる年はうるう年

出力例(year=2024, month=2 のとき):

2024年2月: 29日

year202320001900month412 などに変えて確認してください。

ヒント

月から日数の対応は switch 式が向いています。複数の月をまとめて1つの case にできます。

2月だけは特別扱いで、うるう年判定(複合条件)が必要です。switch 式の中で if-else を使うこともできますが、switch で日数を返したあと、月が2月の場合だけ後から調整する書き方も可能です。

for ループを使って、1 から n までの整数の合計を計算して出力してください。

int n = 100;

出力例(n=100 のとき):

1から100までの合計: 5050
ヒント

合計を保持する変数を 0 で初期化し、ループの中で i を加算していきます。+= 演算子が使えます。

while ループを使って、x を 1 から始めて毎回 2 倍にし、1000 を超える前まで出力してください。

出力例:

1
2
4
8
16
32
64
128
256
512
ヒント

ループの条件は「現在値が 1000 未満」、ループ内で値を 2 倍にしていきます。512 の次は 1024 で条件が false になるため、ループが終了します。

1 から 30 までの整数を出力してください。ただし、

  • 3の倍数のときは Fizz
  • 5の倍数のときは Buzz
  • 3と5の両方の倍数のときは FizzBuzz
  • それ以外は数値そのまま

を出力します。

出力例:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
...
ヒント

判定の順序が重要です。3 の倍数 を先に判定すると、15 のときに Fizz だけが出力されてしまいます。15 の倍数(3 と 5 の最小公倍数)を最初に判定します。

ネストした for ループを使って、1の段から9の段までの九九の表を出力してください。各値は桁が揃うように整形してください。

出力例:

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
ヒント

外側の for で段(1〜9)を、内側の for で掛ける数(1〜9)を回します。

桁揃えには System.out.printf("%4d", value) のように書式指定子を使うと整形できます(%4d は4桁の右揃え)。各行の末尾で System.out.println() を呼んで改行します。

1 から 100 までの整数のうち、3 または 5 の倍数を 除いた 数の合計を計算して出力してください。continue を使って実装してください。

出力例:

合計: 2632
ヒント

for ループで 1 から 100 を回し、ループの本体の冒頭で「3 の倍数または 5 の倍数」なら continue で次のループへスキップします。それ以外の数を合計に加算します。

continue を使わずに if の中で加算することもできますが、ここでは continue の使い方を学ぶことが目的です。

ある整数 n が素数かどうかを判定し、結果を出力してください。素数とは、1 と自分自身でしか割り切れない 2 以上の整数です。

int n = 17;

出力例(n=17 のとき):

17 は素数

n1413100 に変えても正しく判定されることを確認してください。

ヒント

2 から n - 1 まで(または n / 2 まで)試し割りし、1つでも割り切れたら素数ではありません。割り切れる数が見つかった時点で break でループを抜けると効率的です。

n が 2 未満の場合は素数ではないので、最初に判定します。

正の整数 n から始めて、以下の操作を繰り返します:

  • n が偶数なら n / 2 にする
  • n が奇数なら 3n + 1 にする

n が 1 になるまで何ステップかかったかを出力してください。n は 1 以上の整数とし、n = 1 の場合は 0 ステップとなります。

int n = 27;

出力例(n=27 のとき):

n = 27 から始めて、1 に到達するまでのステップ数: 111

n16100 などに変えて確認してください。

コラッツ予想: 「任意の正整数から上記の操作を繰り返すと、必ず 1 に到達する」という未解決の数学予想。実証で検証されているが、証明はまだない。

ヒント

while ループで、n が 1 になるまで処理を続けます。各反復で、n の偶奇を判定して値を更新し、ステップ数のカウンタを増やします。

Collatz 列は途中で値が大きくなることがあります(初期値 27 でも途中で 9232 まで上がる)。さらに大きい初期値だと int の範囲(約 21 億)を超える可能性があるため、nlong で扱うと安全です。

4-L. ユークリッドの互除法(GCD)

Section titled “4-L. ユークリッドの互除法(GCD)”

2 つの正の整数 ab の最大公約数(GCD)を、ユークリッドの互除法で求めて出力してください。

int a = 48;
int b = 36;

ユークリッドの互除法:

  • ab で割った余りを r とする
  • ab に、br に置き換える
  • b が 0 になったときの a が GCD

出力例(a=48, b=36 のとき):

GCD(48, 36) = 12

ab1071, 102917, 5 などに変えて確認してください。

ヒント

while ループで、b が 0 でない間、(a, b) = (b, a % b) の置き換えを繰り返します。一時変数を使って2つの値を同時に更新する必要があります。

ループが終わったときの a が GCD です。

整数 n が回文数(桁を逆順にしても元の数と同じ整数)かどうかを判定して出力してください。n は正の整数とします。

int n = 12321;

出力例(n=12321 のとき):

12321 は回文数

n121123451 などに変えて確認してください(12345 は回文数ではない)。

ヒント

整数を逆順にする方法:

  • n を 10 で割った余りが1の位
  • n を 10 で割った商を新しい n とすると、次の桁を1の位として取り出せる
  • これを繰り返しながら、取り出した桁を新しい数として組み立てると、元の数の桁を逆順にした整数ができる

元の n を保持するために、別の変数(例: original)にコピーしてから処理を始めます(処理中に n が破壊されるため)。最後に original と「逆順にした数」を比較します。