1054
本題的基本要求非常簡單:給定 N 個實數,計算它們的平均值。但複雜的是有些輸入資料可能是非法的。一個“合法”的輸入是 [−1000,1000] 區間内的實數,并且最多精确到小數點後 2 位。當你計算平均值的時候,不能把那些非法的資料算在内。
輸入格式:
輸入第一行給出正整數 N(≤100)。随後一行給出 N 個實數,數字間以一個空格分隔。
輸出格式:
對每個非法輸入,在一行中輸出 ERROR: X is not a legal number,其中 X 是輸入。最後在一行中輸出結果:The average of K numbers is Y,其中 K 是合法輸入的個數,Y 是它們的平均值,精确到小數點後 2 位。如果平均值無法計算,則用 Undefined 替換 Y。如果 K 為 1,則輸出 The average of 1 number is Y。
輸入樣例 1:
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
輸出樣例 1:
ERROR: aaa is not a legal number
ERROR: 9999 is not a legal number
ERROR: 2.3.4 is not a legal number
ERROR: 7.123 is not a legal number
The average of 3 numbers is 1.38
輸入樣例 2:
2
aaa -9999
輸出樣例 2:
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined
思路: 這題一開始沒什麼思路不知道如何判斷是否為合法數字,後來看了别人的思路,用抛出異常的方式判斷是否能轉換為double型來判斷是否合法,其中還飛判斷是否後面位數多餘兩個,這裡使用了總長度減去小數點所在位置來判斷小數點後的位數來判斷是否合法.題目最後的如果 K 為 1,則輸出 The average of 1 number is Y沒看出什麼特别用意,有想法的可以提醒我下.
代碼:
package test1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class PTA1054 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
String[] number = br.readLine().split(" ");
double sum = 0;
double counts = 0;
for (int i = 0; i < n; i++) {
try {//通過捕捉異常的方式判斷是否合法,如果能轉為double型就無異常,不能則抛出異常
double x = Double.parseDouble(number[i]);
int cha = 0;
//擷取小數點後的位數進而判斷是否合法
if (number[i].contains(".")) {
cha = number[i].length() - number[i].indexOf(".") - 1;
}
if (x >= -1000 && x <= 1000 && cha <= 2 && cha >= 0) {
sum += x;
counts++;
} else {
throw new Exception();
}
} catch (Exception e) {
System.out.printf("ERROR: %s is not a legal number\n", number[i]);
}
}
if (counts == 0) {
System.out.printf("The average of %.0f numbers is Undefined", counts);
} else{
System.out.printf("The average of %.0f number is %.2f\n", counts, sum / counts);
}
}
}