題目描述

輸入一個整數ch,這個ch整數值所代表的意義如下:



ch=1表示要計算邊長為a的正方體體積。
ch2表示要計算長、寬、高為l、b、h的長方體體積。
ch3表示要計算半徑為r的半球體體積。
ch4表示要計算半徑為r、高為h的圓柱體體積。

撰寫一個Calculate類別,分別按照上面的要求實作出不同的方法,要將計算結果省略至小數點第3位來輸出。

若輸入的長度小於0,要輸出「java.lang.NumberFormatException: All the values must be positive」。

原題網址

https://www.hackerrank.com/challenges/calculating-volume

輸入格式

第一行輸入一個整數T,表示測試資料的數量,接下來的T組資料,一開始要先輸入ch值,範圍在1到4之間(包含1和4),接著依照ch的不同而有以下幾種不一樣的輸入:

ch=1,接下來的一行要輸入正方體的長度a。
ch=2,接下來的三行要分別輸入長方體的長度l、寬度b、高度h。
ch=3,接下來的一行要輸入半球體的半徑r。
ch=4,接下來的兩行要分別輸入圓柱體的半徑r和高度h。

a、l、b、h、r的值皆在-100到100之間(包含-100和100)。

輸出格式

計算每組測試資料,輸出四捨五入至小數點後第三位的計算結果。

範例輸入1

2
1
4
4
67.89
-98.54

範例輸出1

64.000
java.lang.NumberFormatException: All the values must be positive

額外解釋1

在這兩組測試資料中,第一組測試資料的ch為1,所以是要計算正方體的體積。接下來輸入的a為4,正方體體積算法為:

a * a * a = 4 * 4 * 4 = 64.000

第一組測試資料的ch為4,所以是要計算圓柱體的體積,但輸入的圓柱體高度是負數,因此輸出「java.lang.NumberFormatException: All the values must be positive」。

範例輸入2

1
3
1.02

範例輸出2

2.223

解題概念

實作Calculating類別來處理標準輸入串流和實際用來計算體積的物件。實作Volume類別來計算體積。實作Printer類別來處理小數點輸出和輸入負數的輸出。

參考答案

import java.io.IOException;
import java.security.Permission;
import java.util.Scanner;

class Printer {

    public void display(final double volume) throws IOException {
        if (volume > 0) {
            System.out.printf("%.3f%n", volume);
        } else {
            System.out.println("java.lang.NumberFormatException: All the values must be positive");
            throw new IOException();
        }
    }
}

class Volume {

    public double main(final int a) {
        return a * a * a;
    }

    public double main(final int l, final int b, final int h) {
        return l * b * h;
    }

    public double main(final double r) {
        return 2 * Math.PI * r * r * r / 3;
    }

    public double main(final double r, final double h) {
        return Math.PI * r * r * h;
    }
}

class Calculate {

    private static final Scanner sc = new Scanner(System.in);
    private static final Volume v;
    public static final Printer output = new Printer();

    static {
        v = new Volume();
    }

    public static Volume get_Vol() {
        return v;
    }

    public int getINTVal() {
        return sc.nextInt();
    }

    public double getDoubleVal() {
        return sc.nextDouble();
    }
}

public class Solution {

    public static void main(final String[] args) {
        Do_Not_Terminate.forbidExit();
        try {
            final Calculate cal = new Calculate();
            int T = cal.getINTVal();
            while (T-- > 0) {
                double volume = 0.0d;
                final int ch = cal.getINTVal();
                switch (ch) {
                    case 1:
                        final int a = cal.getINTVal();
                        volume = Calculate.get_Vol().main(a);
                        break;
                    case 2: {
                        final int l = cal.getINTVal();
                        final int b = cal.getINTVal();
                        final int h = cal.getINTVal();
                        volume = Calculate.get_Vol().main(l, b, h);
                        break;
                    }
                    case 3: {
                        final double r = cal.getDoubleVal();
                        volume = Calculate.get_Vol().main(r);
                        break;
                    }
                    case 4: {
                        final double r = cal.getDoubleVal();
                        final double h = cal.getDoubleVal();
                        volume = Calculate.get_Vol().main(r, h);
                        break;
                    }
                    default:
                        break;
                }
                cal.output.display(volume);
            }

        } catch (NumberFormatException e) {
            System.out.print(e);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Do_Not_Terminate.ExitTrappedException e) {
            System.out.println("Unsuccessful Termination!!");
        }
    }
}

class Do_Not_Terminate {

    public static class ExitTrappedException extends SecurityException {
    }

    public static void forbidExit() {
        final SecurityManager securityManager = new SecurityManager() {
            @Override
            public void checkPermission(final Permission permission) {
                if (permission.getName().contains("exitVM")) {
                    throw new ExitTrappedException();
                }
            }
        };
        System.setSecurityManager(securityManager);
    }
}