字符串處理

PAT Basic Level 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

需要注意的地方有:
1.測試點會檢查1000和-1000的邊界值
2.數字可以只以小數點結尾
3.數字前正負號只可有一個
4.不包含字母
可以使用正則表達式,也可以用Double.parseDouble()然后拋異常的方法。
方法一:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br;
        br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.valueOf(br.readLine());
        String s = br.readLine();
        br.close();
        StringTokenizer st = new StringTokenizer(s);
        String regex = "[+-]?(([1-9][0-9]{0,3})|0)(\\.\\d{2})?";
        Pattern pattern = Pattern.compile(regex);
        double count = 0;
        int cnt=0;
        String tmp = "";
        while(st.hasMoreTokens()){
            tmp = st.nextToken();
            Matcher matcher = pattern.matcher(tmp);
            if(matcher.matches()&&Float.valueOf(tmp)<=1000&&Float.valueOf(tmp)>=-1000){
                cnt++;
                count+=Double.valueOf(tmp);
            }
            else System.out.print("ERROR: "+tmp+" is not a legal number\n");
        }
        if(cnt==0)    System.out.println("The average of 0 numbers is Undefined");
        else if(cnt==1)    System.out.println("The average of 1 number is "+String.format("%.2f",count));
        else    System.out.println("The average of "+cnt+" numbers is "+String.format("%.2f",count/cnt));
    }
}

由Double.parseDouble()方法拋異常的寫法如下:

import java.util.Scanner;
public class Main1054_2 {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int cnt=0;
        double count=0;
        for(int i=0;i<N;i++){
            String s = null;
            double d=0;
            try{
                s = sc.next();
                d = Double.parseDouble(s);    //自動拋出非實數的異常
                double x = Double.parseDouble(String.format("%.2f",d));
                if(d>1000 || d<-1000||Math.abs(x-d)>=0.001){   //帶小數點超過兩位數或者未在[-1000,1000]范圍則手動拋異常
                    throw new NumberFormatException();
                }
                cnt++;
                count+=d;
            }catch (NumberFormatException e){
                System.out.println("ERROR: "+s+" is not a legal number");
            }
        }
        sc.close();
        if(cnt==0)  System.out.println("The average of 0 numbers is Undefined");
        else if(cnt==1)  System.out.printf("The average of 1 number is %.2f",count);
        else System.out.printf("The average of %d numbers is %.2f",cnt,count/cnt);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容