演習: 条件分岐と繰り返し
各問題のコードは、Main クラスの main メソッドの中に書く前提です。
4-A. 数値の符号判定
Section titled “4-A. 数値の符号判定”変数 n の値が正・負・ゼロのいずれかを判定して出力してください。
int n = -5;出力例(n=-5 のとき):
負n を 0 や 7 に変えても正しく判定されることを確認してください。
ヒント
if / else if / else で3つの場合を表します。
4-B. 信号機の判定(switch 式)
Section titled “4-B. 信号機の判定(switch 式)”信号の色を表す文字を受け取り、対応する指示を出力してください。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 -> 結果;String も switch の対象にできます(比較は equals で行われます)。
4-D. 月の日数判定
Section titled “4-D. 月の日数判定”年と月を受け取り、その月の日数を出力してください。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日year を 2023、2000、1900、month を 4、12 などに変えて確認してください。
ヒント
月から日数の対応は switch 式が向いています。複数の月をまとめて1つの case にできます。
2月だけは特別扱いで、うるう年判定(複合条件)が必要です。switch 式の中で if-else を使うこともできますが、switch で日数を返したあと、月が2月の場合だけ後から調整する書き方も可能です。
4-E. 1 から N までの合計
Section titled “4-E. 1 から N までの合計”for ループを使って、1 から n までの整数の合計を計算して出力してください。
int n = 100;出力例(n=100 のとき):
1から100までの合計: 5050ヒント
合計を保持する変数を 0 で初期化し、ループの中で i を加算していきます。+= 演算子が使えます。
4-F. 倍々ループ
Section titled “4-F. 倍々ループ”while ループを使って、x を 1 から始めて毎回 2 倍にし、1000 を超える前まで出力してください。
出力例:
1248163264128256512ヒント
ループの条件は「現在値が 1000 未満」、ループ内で値を 2 倍にしていきます。512 の次は 1024 で条件が false になるため、ループが終了します。
4-G. FizzBuzz
Section titled “4-G. FizzBuzz”1 から 30 までの整数を出力してください。ただし、
- 3の倍数のときは
Fizz - 5の倍数のときは
Buzz - 3と5の両方の倍数のときは
FizzBuzz - それ以外は数値そのまま
を出力します。
出力例:
12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz...ヒント
判定の順序が重要です。3 の倍数 を先に判定すると、15 のときに Fizz だけが出力されてしまいます。15 の倍数(3 と 5 の最小公倍数)を最初に判定します。
4-H. 九九の表
Section titled “4-H. 九九の表”ネストした 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() を呼んで改行します。
4-I. continue による倍数除外
Section titled “4-I. continue による倍数除外”1 から 100 までの整数のうち、3 または 5 の倍数を 除いた 数の合計を計算して出力してください。continue を使って実装してください。
出力例:
合計: 2632ヒント
for ループで 1 から 100 を回し、ループの本体の冒頭で「3 の倍数または 5 の倍数」なら continue で次のループへスキップします。それ以外の数を合計に加算します。
continue を使わずに if の中で加算することもできますが、ここでは continue の使い方を学ぶことが目的です。
4-J. 素数判定
Section titled “4-J. 素数判定”ある整数 n が素数かどうかを判定し、結果を出力してください。素数とは、1 と自分自身でしか割り切れない 2 以上の整数です。
int n = 17;出力例(n=17 のとき):
17 は素数n を 1、4、13、100 に変えても正しく判定されることを確認してください。
ヒント
2 から n - 1 まで(または n / 2 まで)試し割りし、1つでも割り切れたら素数ではありません。割り切れる数が見つかった時点で break でループを抜けると効率的です。
n が 2 未満の場合は素数ではないので、最初に判定します。
4-K. コラッツ予想
Section titled “4-K. コラッツ予想”正の整数 n から始めて、以下の操作を繰り返します:
nが偶数ならn / 2にするnが奇数なら3n + 1にする
n が 1 になるまで何ステップかかったかを出力してください。n は 1 以上の整数とし、n = 1 の場合は 0 ステップとなります。
int n = 27;出力例(n=27 のとき):
n = 27 から始めて、1 に到達するまでのステップ数: 111n を 1、6、100 などに変えて確認してください。
コラッツ予想: 「任意の正整数から上記の操作を繰り返すと、必ず 1 に到達する」という未解決の数学予想。実証で検証されているが、証明はまだない。
ヒント
while ループで、n が 1 になるまで処理を続けます。各反復で、n の偶奇を判定して値を更新し、ステップ数のカウンタを増やします。
Collatz 列は途中で値が大きくなることがあります(初期値 27 でも途中で 9232 まで上がる)。さらに大きい初期値だと int の範囲(約 21 億)を超える可能性があるため、n は long で扱うと安全です。
4-L. ユークリッドの互除法(GCD)
Section titled “4-L. ユークリッドの互除法(GCD)”2 つの正の整数 a と b の最大公約数(GCD)を、ユークリッドの互除法で求めて出力してください。
int a = 48;int b = 36;ユークリッドの互除法:
aをbで割った余りをrとするaをbに、bをrに置き換えるbが 0 になったときのaが GCD
出力例(a=48, b=36 のとき):
GCD(48, 36) = 12a、b を 1071, 1029、17, 5 などに変えて確認してください。
ヒント
while ループで、b が 0 でない間、(a, b) = (b, a % b) の置き換えを繰り返します。一時変数を使って2つの値を同時に更新する必要があります。
ループが終わったときの a が GCD です。
4-M. 回文数判定
Section titled “4-M. 回文数判定”整数 n が回文数(桁を逆順にしても元の数と同じ整数)かどうかを判定して出力してください。n は正の整数とします。
int n = 12321;出力例(n=12321 のとき):
12321 は回文数n を 121、12345、1 などに変えて確認してください(12345 は回文数ではない)。
ヒント
整数を逆順にする方法:
nを 10 で割った余りが1の位nを 10 で割った商を新しいnとすると、次の桁を1の位として取り出せる- これを繰り返しながら、取り出した桁を新しい数として組み立てると、元の数の桁を逆順にした整数ができる
元の n を保持するために、別の変数(例: original)にコピーしてから処理を始めます(処理中に n が破壊されるため)。最後に original と「逆順にした数」を比較します。