Java練習問題「中級」

## Java練習問題「中級」





### 整数値を入力させ、その値が偶数ならばeven、奇数ならばoddと表示するプログラムを作成せよ。
```java
    private static void question40(int num1) {
        System.out.println("問40");
        if (num1 % 2 == 0) {
            System.out.println("even");
        } else {
            System.out.println("odd");
        }
    }
```
###整数値を入力させ、その値が一桁の自然数かそうでないか判定するプログラムを作成せよ。
```java     
    private static void question41(int num1) {
        System.out.println("問41");
        if (num1 > 0 && num1 <= 9) {
            System.out.println(num1);
        }
    }
```
###  整数値を3つ入力させ、それらの値が小さい順（等しくてもよい）に並んでいるか判定し、小さい順に並んでいる場合はOK、そうなっていない場合はNGと表示するプログラムを作成せよ。
```java
    private static void question42(int num1, int num2, int num3) {
        System.out.println("問42");
//        if ((num1 < num2 && num2 < num3) || (num1 == num2 || num2 == num3)) {
        if (num1 <= num2 && num2 <= num3){
            System.out.println("ok");
        } else {
            System.out.println("NG");
        }
    }
```
### 2次方程式 ax^2 + bx + c = 0 （x^2はxの2乗の意味）の係数a, b, cを入力し、2次方程式の解が2つの実数解か、重解か、2つの虚数解かを判別するプログラムを作成せよ。
```java
     * <p>
     * 2乗して負の数になるものが虚数。
     * 虚数以外の数が実数。
     * 重解は解が1つになる。
     */
    private static void question43(int a, int b, int c) {
        System.out.println("問43");
        int d = b * b - 4 * a * c;
        if (d > 0) {
            System.out.print("２つの実数解");
        } else if (d == 0) {
            System.out.print("重解");
        } else {
            System.out.println("虚数解");
        }
    }
```
## 換算したい金額（円単位）と1ドル何円かを整数値で入力すると、入力した金額が何ドル何セントか計算して表示するプログラムを作成せよ。1セントは1/100ドルである。結果は整数値でよい（1セント未満の端数切り捨て）。
```java 
    private static void question44(int money, int doller) {
        System.out.println("問44");
        // 円をドル：換算したい円÷1ドル当たりの円価格
        int yen = money / doller;
        //1セントは1/100ドル
        //TODO　ちゃんと切り捨てできてるかみる　四捨五入
        System.out.println("1ドルは何円?");
        System.out.println(money + "円は" + yen + "ドルで" + "です");
    }
```
##  初乗り料金が1700mまで610円、それ以降は313mごとに80円のタクシーがある。このタクシーに乗った距離をm単位で入力し、料金を計算するプログラムを作成せよ。
```java
    private static void question45(int m) {
        System.out.println("問45");
        // 1700mまで610円
        int taxi = 610;
        int price = 0;
        // 1700m以下なら610円にする
        if (m < 1700) {
            price = taxi;
        } else {
            //1700m超えた超過した距離
            double increase = m - 1700;
            //313mごとが何回きたかどうか
            double number = increase / 313;
            //回数に80円かける
            //回数を小数点第一で繰り上げする
            price = Double.valueOf(taxi + (Math.ceil(number) * 80)).intValue();
        }
        System.out.println("タクシー料金は" + price + "円です");
    }
```
## 神山美術館の入場料金は、一人600円であるが、5人以上のグループなら一人550円、20人以上の団体なら一人500円である。人数を入力し、入場料の合計を計算するプログラムを作成せよ。
```java
    private static void question46(int human) {
        System.out.println("問46");
        int nyuzyou1 = 600;
        int nyuzyou2 = 550;
        int nyuzyou3 = 500;
        int price = 0;
        //もし一人なら600円
        //20人以上なら一人500円
        if (human < 5) {
            price = human*nyuzyou1;
        //5人以上20人未満なら一人550円
        }else if (human < 20) {
            price = human*nyuzyou2;
        //20人以上なら一人500円
        }else {
            price = human*nyuzyou3;
        }
        System.out.println("入場料は" +  price + "円です");
    }
```
## 異なる整数値を2つ入力し、それぞれ別の変数に格納する。そして、それらの変数の値を入れ替えた後、
それぞれの変数の値を表示するプログラムを作成せよ。単に順序を変えて表示するだけではダメ。必ず変数の値を入れ替えること。下の実行例の場合、まず変数aに2、bに5が入力された状態から、aの値が5、bの値が2になるように入れ替える。

```java
    private static void question47(int a, int b) {
        System.out.println("問47");
        // 交換前の変数の値を表示
        System.out.println( "交換前 : a=" + a + "  b=" + b );
        // 一時変数に代入
        int x = a;
        a = b;
        b = x;
        // 交換後
        System.out.println("交換後: a=" + a + "  b=" + b);
    }
```
## 最初に2以上の整数値を入力し、次の規則で計算し、計算回数と計算結果を表示し、計算結果が1になるまで繰り返すプログラムを作成せよ。規則：ある値が偶数ならその値を1/2にする。奇数ならその値を3倍して1を足す。
```java
     * while文

    private static void question48(int number) {
        System.out.println("問48");
        System.out.println("number:" + number);
        for (int i = 1, answer = number; answer != 1; i++) {
            answer = answer % 2 == 0 ? answer / 2 : answer * 3 + 1;
            System.out.println(i + ": " + answer);
        }
    }
```
## 九九の表を、2重の繰り返しを使って表示するプログラムを作成せよ。2重の繰り返しを使わず単に表示するだけではダメ。
```java
     * 値の間はタブ(\t)を使って間をあけること。
     * TODO 最後のタブ出さない

    private static void question49() {
        System.out.println("問49");
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j < 10; j++) {
               System.out.print(i * j + "\t");
            }
            System.out.println("");
        }
    }
```
## 1から100までの値を繰り返しで表示するが、3の倍数の時はfoo、5の倍数の時はbarと数字の代わりに表示するプログラムを作成せよ。なお、3と5の両方の倍数の時はfoobarと表示される。
```java
     private static void question50() {
         System.out.println("問50");
         for (int i = 1; i <= 100; i++) {
             if(i % 3 == 0 && i % 5 == 0) {
                 // 3の倍数かつ5の倍数のとき
                     System.out.println("foobar");
                     // 3の倍数のとき
                 } else if(i % 3 == 0){
                     System.out.println("foo");
                 } else if(i % 5 == 0) {
                 System.out.println("bar");
             }else {
                 // どれにも該当しない場合
                 System.out.println(i);
             }
         }
     }
```
## 指定した金額を100円玉と10円玉だけで、できるだけ少ない枚数で支払いたい。 金額を入力するとそれぞれの枚数を計算して表示するプログラムを作成せよ。
```java
    private static void question51(int money) {
        System.out.println("問51");
        int hyaku = money/100;
        int zyuu = (money-(hyaku*100))/10;
        // 100円玉
        System.out.println("100円玉" + hyaku + "枚です");
        // 10円玉
        System.out.println("10円玉" + zyuu + "枚です");
    }
```
## 西暦を入力したらその年が閏（うるう）年かどうかを判定するプログラムを作成せよ。なお、4で割り切れる年のうち、100で割り切れないか、400で割り切れる年は閏年である。
```java
    private static void question52(int year) {
        System.out.println("問52");
        boolean check = false;
        // 年号を4で割った余りが0
        if (year % 4 == 0 && year % 100 == 0 && year % 400 == 0) {
                    check = true;
            } else {
                check = true;
        }
        // String s = b ? "真" : "偽";
        System.out.println(check ? "うるう年です。" : "うるう年ではありません。");
    }
```
##  自然数の入力値を素因数分解して結果を表示するプログラムを作成せよ。

```java

    private static void question53(int number) {
        System.out.println("問53");
        System.out.print(number + "=");
        // For文の初期値が２なのは素数は２以上
        for (int i = 2; i <= number; i++) {
            if (number % i == 0) {
                //割り切れれば i は素数。
                //割り切れなければ素数ではない。
                number /= i;
                if (number == 1) {
                    System.out.print(i);
                }else {
                    System.out.print(i + "×");
                }
            }
        }
    }
```