繰り返しと条件分岐の複合問題
Java練習問題 第5回では「繰り返し処理」についての問題を用意してあります。
「繰り返し処理」の解説はこちら
問題 13 難易度 ★★★★
「先に 2 勝した方を優勝とする、じゃんけんゲームプログラム」、を作成してください。
表示内容は以下の実行例を参考にしてください。
実行例
じゃんけんゲーム始めるよー
PC と勝負です!
先に 2 勝した方が優勝です!!
第 1 回戦:あなたの手を数字で選んでください
0:ぐー 1:ちょき 2:ぱー
0
あなたの手は「ぐー」、PC の手は「ちょき」。
あなたの勝ちです。
あなた:1 勝、PC:0 勝、あいこ:0 回
第 2 回戦:あなたの手を数字で選んでください
0:ぐー 1:ちょき 2:ぱー
1
あなたの手は「ちょき」、PC の手は「ぐー」。
PC の勝ちです。
あなた:1 勝、PC:1 勝、あいこ:0 回
第 3 回戦:あなたの手を数字で選んでください
0:ぐー 1:ちょき 2:ぱー
2
あなたの手は「ぱー」、PC の手は「ちょき」。
PC の勝ちです。
あなた:1 勝、PC:2 勝、あいこ:0 回
ゲーム終了! 優勝者は PC です
問題 13 解答
正解は、、、
public class Main_0313 {
public static void main(String[] args) {
System.out.println("じゃんけんゲーム始めるよー");
System.out.println("PC と勝負です!");
System.out.println("先に 2 勝した方が優勝です!!\n");
int userWin = 0;//ユーザー勝利回数
int pcWin = 0;//PC 勝利回数
int draw = 0;//あいこの回数
while (userWin < 2 && pcWin < 2) {//どちらかが二勝するまで繰り返す
System.out.print("第" + (userWin + pcWin + draw + 1) + "回戦:");
System.out.println("あなたの手を数字で選んでください");
System.out.println("0:ぐー 1:ちょき 2:ぱー");
int userHand = new java.util.Scanner(System.in).nextInt();
int pcHand = new java.util.Random().nextInt(2);
String strUserHand = "";
if (userHand == 0) {
strUserHand = "ぐー";
} else if (userHand == 1) {
strUserHand = "ちょき";
} else if (userHand == 2) {
strUserHand = "ぱー";
}
String strPcHand = "";
if (pcHand == 0) {
strPcHand = "ぐー";
} else if (pcHand == 1) {
strPcHand = "ちょき";
} else if (pcHand == 2) {
strPcHand = "ぱー";
}
System.out.println(
"あなたの手は「" + strUserHand + "」、"
+ "PC の手は「" + strPcHand + "」。");
String result = "";
switch (userHand - pcHand) {
case -2:
case 1:
result = "PC の勝ち";
pcWin++;
break;
case -1:
case 2:
result = "あなたの勝ち";
userWin++;
break;
case 0:
result = "あいこ";
draw++;
break;
default:
break;
}
System.out.println(result + "です。");
System.out.println(
"あなた:" + userWin + "勝、"
+ "PC:" + pcWin + "勝、"
+ "あいこ:" + draw + "回\n");
}
String winner = "";
if (pcWin > userWin) {
winner = "PC";
} else {
winner = "あなた";
}
System.out.println("ゲーム終了! 優勝者は" + winner + "です");
}
}
問題 14 難易度 ★★
以下の実行例のように表示される、試験結果集計プログラムを作成してください。
なお、点数がマイナスの場合も、その点数を活かした処理ができる仕様にしてください。
実行例
生徒の人数を整数で入力してください
4
1 番目の生徒の点数を入力してください。
25
2 番目の生徒の点数を入力してください。
-5
3 番目の生徒の点数を入力してください。
33
4 番目の生徒の点数を入力してください。
50
4 人の生徒の平均点は、25.75 点です。
最高点は、50 点です。
最低点は、-5 点です。
問題 14 解答
正解は、、、
public class Main_0314 {
public static void main(String[] args) {
System.out.println("生徒の人数を整数で入力してください");
int num = new java.util.Scanner(System.in).nextInt();
int sum = 0;//合計点
int min = 0;//最低点
int max = 0;//最高点
for (int i = 0; i < num; i++) {//人数分繰り返し
System.out.println();
System.out.println((i + 1) + "番目の生徒の点数を入力してください。");
int score = new java.util.Scanner(System.in).nextInt();
sum += score;
if (i == 0) { //0 番目の生徒の得点を、暫定最高点と暫定最低点とする。
min = score;
max = score;
} else {
if (score < min) {
min = score;
}
if (score > max) {
max = score;
}
}
}
System.out.println();
System.out.println(num +"人の生徒の平均点は、"+ ((double) sum / num) +"点です。");
System.out.println("最高点は、" + max + "点です。");
System.out.println("最低点は、" + min + "点です。");
}
}
繰り返し文を使用したアルゴリズムを考える
問題 15 難易度 ★★★
素数判定プログラムを作成してください。
素数とは、1以上の整数で、1とその数でしか割り切ることのできない整数のことを指します。
また、大きな数でも判定できるよう、入力値の型はlongにしてください。
実行例
素数判定したい整数を入力してください
9999991
9999991 は素数です
問題 15 解答
正解は、、、
public class Main_0315 {
public static void main(String[] args) {
System.out.println("素数判定したい整数を入力してください");
long num = new java.util.Scanner(System.in).nextLong();
String res = "素数です";
for (long i = 2; i < num; i++) {
if (num % i == 0) {
res = "素数ではありません";
break;
}
}
System.out.println(num + "は" + res);
}
} //これは単純なアルゴリズムです。もっと早い処理も考えてみましょう。
問題 16 難易度 ★★★
以下の二つの内容を表示するプログラムを作成してください。
① 5 億以下の数で、もっとも大きな素数を出力して下さい。
② 5 億以上の数で、もっとも小さな素数を出力して下さい。
実行例
5 億以下の数で、もっとも大きな素数は、499999993 です。
5 億以上の数で、もっとも小さな素数は、500000003 です。
問題 16 解答
正解は、、、
public class Main_0316 {
public static void main(String[] args) {
int num1 = 500000000;
for (int i = num1; i > 0; i--) {
boolean isPrime = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
System.out.println("5 億以下の数で、もっとも大きな素数は、"+ i +" です。");
break;
}
}
int num2 = 500000000;
while (true) {
boolean isPrime = true;
for (int j = 2; j < num2; j++) {
if (num2 % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
System.out.println("5 億以上の数で、もっとも小さな素数は、"+ num2 +" です。");
break;
}
num2++;
}
}
} //これは単純なアルゴリズムです。もっと早い処理も考えてみましょう。
問題 17 難易度 ★★★★
30 以下の素数を列挙するプログラムを作成してください。
実行例
2 3 5 7 11 13 17 19 23 29
問題 17 解答
正解は、、、
public class Main_0317 {
public static void main(String[] args) {
for (int i = 2; i <= 30; i++) {
boolean isPrimeNumber = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrimeNumber = false;
break;
}
}
if (isPrimeNumber) {
System.out.print(i + " ");
}
}
}
} //これは単純なアルゴリズムです。もっと早い処理も考えてみましょう
Java練習問題 第6回では「配列」から出題します。
コメント