PAT-B 1054. 求平均值 (20)

傳送門

https://pintia.cn/problem-sets/994805260223102976/problems/994805272659214336

題目

本題的基本要求非常簡單:給定N個(gè)實(shí)數(shù)和措,計(jì)算它們的平均值荚守。但復(fù)雜的是有些輸入數(shù)據(jù)可能是非法的。一個(gè)“合法”的輸入是[-1000间坐,1000]區(qū)間內(nèi)的實(shí)數(shù)面粮,并且最多精確到小數(shù)點(diǎn)后2位匠题。當(dāng)你計(jì)算平均值的時(shí)候,不能把那些非法的數(shù)據(jù)算在內(nèi)但金。
輸入格式:
輸入第一行給出正整數(shù)N(<=100)韭山。隨后一行給出N個(gè)正整數(shù),數(shù)字間以一個(gè)空格分隔冷溃。
輸出格式:
對(duì)每個(gè)非法輸入钱磅,在一行中輸出“ERROR: X is not a legal number”,其中X是輸入似枕。最后在一行中輸出結(jié)果:“The average of K numbers is Y”盖淡,其中K是合法輸入的個(gè)數(shù),Y是它們的平均值凿歼,精確到小數(shù)點(diǎn)后2位褪迟。如果平均值無法計(jì)算,則用“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.先判長度虐拓,太長直接out心俗;
2.如果長度符合,開始遍歷,計(jì)算小數(shù)點(diǎn)的數(shù)目城榛,如果超過1揪利,即非法;而一旦發(fā)現(xiàn)有非數(shù)字非小數(shù)點(diǎn)的情況狠持,也認(rèn)定為非法疟位;
3.到這步后肯定是只有數(shù)字和小數(shù)點(diǎn)還有負(fù)號(hào)的組合了,再排除小數(shù)點(diǎn)后面超過兩位的情況(用長度-小數(shù)點(diǎn)的索引看是否大于3)喘垂,還有去掉正數(shù)情況下小數(shù)點(diǎn)開頭的情況甜刻,以及負(fù)數(shù)情況下小數(shù)點(diǎn)在第2個(gè)位置(索引為1)的情況。接著還有以小數(shù)點(diǎn)結(jié)尾的情況王污,也要考慮進(jìn)去罢吃。(這一條也是這道題不嚴(yán)謹(jǐn)?shù)牡胤匠纾绻J(rèn)定了小數(shù)點(diǎn)結(jié)尾的情況為非法昭齐,則第四個(gè)測(cè)試點(diǎn)無法通過,去掉即可通過)

后來怕出現(xiàn)000000.1這種情況矾柜,于是把對(duì)長度的判斷去掉了阱驾,但是這道題中的4個(gè)測(cè)試點(diǎn)并沒有這種數(shù)據(jù)。

遇到的坑:
1.stringstream轉(zhuǎn)換時(shí)怪蔑,要進(jìn)行清空和重置狀態(tài)標(biāo)志的操作(保險(xiǎn)起見兩個(gè)都做)里覆;

stringstream.clear(); //重置stringstream的狀態(tài)標(biāo)志
stringstream.str(""); //清空數(shù)據(jù)

2.不知道是不是坑,還是改掉了缆瓣,就是開始是拿double型變量>=1000比較的喧枷,但是怕double和int的相等比較出問題,所以還是只比較double型變量<1000比較保險(xiǎn)一些弓坞;
3.原題中有說明隧甚,當(dāng)k=1時(shí)輸出number而不是numbers。

源代碼

//C/C++實(shí)現(xiàn)
#include <iostream>
#include <sstream>

using namespace std;

int main(){
    int n;
    scanf("%d", &n);
    string tmp;
    double tmp_d;
    int tmp_i;
    stringstream ss;
    int correctCount = 0;
    double sum = 0;
    for(int i = 0; i < n; ++i){
        cin >> tmp;
        bool correct = true;
        bool minus = false; 
        if(tmp[0] == '-'){
            minus = true;
        }
        int count = 0; //計(jì)算小數(shù)點(diǎn)的個(gè)數(shù)
        int j = (minus == false ? 0 : 1);
        for(; j < tmp.size(); ++j){
            if(tmp[j] == '.'){
                ++count;
                if(count > 1){ //小數(shù)點(diǎn)個(gè)數(shù)超過1 
                    correct = false;
                    break;
                }
            }
            else if(tmp[j] >= '0' && tmp[j] <= '9'){
                continue;
            }
            else{ //非小數(shù)點(diǎn)非數(shù)字
                correct = false;
                break;
            }
        }
        if(!correct){
            cout << "ERROR: " << tmp << " is not a legal number" << endl;
        }
        else{
            if(count == 0){ //整數(shù) 
                ss << tmp;
                ss >> tmp_i;
                ss.clear(); //重置stringstream的狀態(tài)標(biāo)志
                ss.str(""); //清空數(shù)據(jù)
                if(tmp_i < -1000 || tmp_i > 1000){
                    correct = false;
                }
                else{
                    sum += tmp_i;
                    ++correctCount;
                }
            }
            else{ //小數(shù) 
                int point = tmp.find('.');
                if(tmp.size() - point > 3){ //小數(shù)點(diǎn)后面超過2位 
                    correct = false;
                }
                //else if(point == tmp.size() - 1){ //小數(shù)點(diǎn)在最后一位渡冻,也不對(duì) 
                //  correct = false;
                //}
                else if(minus == true && point == 1){ //形如:-.x
                    correct = false;
                }
                else if(minus == false && point == 0){ //形如:.x
                    correct = false;
                }
                else{
                    ss << tmp;
                    ss >> tmp_d;
                    ss.clear(); //重置stringstream的狀態(tài)標(biāo)志
                    ss.str(""); //清空數(shù)據(jù)
                    if(tmp_d < -1000 || tmp_d > 1000){
                        correct = false;
                    }
                    else{
                        sum += tmp_d;
                        ++correctCount; 
                    }
                }
            }
            if(!correct){
                cout << "ERROR: " << tmp << " is not a legal number" << endl;
            }
        }
    }
    if(correctCount == 0){
        printf("The average of 0 numbers is Undefined\n");
    }
    else if(correctCount == 1){
        printf("The average of 1 number is %.2f\n", sum);
    }
    else{
        printf("The average of %d numbers is %.2f\n", correctCount, sum / correctCount);
    }
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末戚扳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子族吻,更是在濱河造成了極大的恐慌帽借,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件超歌,死亡現(xiàn)場(chǎng)離奇詭異砍艾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巍举,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門辐董,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人禀综,你說我怎么就攤上這事简烘√ρ希” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵孤澎,是天一觀的道長届氢。 經(jīng)常有香客問我,道長覆旭,這世上最難降的妖魔是什么退子? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮型将,結(jié)果婚禮上寂祥,老公的妹妹穿的比我還像新娘。我一直安慰自己七兜,他們只是感情好丸凭,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腕铸,像睡著了一般惜犀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狠裹,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天虽界,我揣著相機(jī)與錄音,去河邊找鬼涛菠。 笑死莉御,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俗冻。 我是一名探鬼主播礁叔,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼言疗!你這毒婦竟也來了晴圾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤噪奄,失蹤者是張志新(化名)和其女友劉穎死姚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勤篮,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡都毒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碰缔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片账劲。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瀑焦,到底是詐尸還是另有隱情腌且,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布榛瓮,位于F島的核電站铺董,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏禀晓。R本人自食惡果不足惜精续,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粹懒。 院中可真熱鬧重付,春花似錦、人聲如沸凫乖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拣凹。三九已至森爽,卻和暖如春恨豁,著一層夾襖步出監(jiān)牢的瞬間嚣镜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國打工橘蜜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菊匿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓计福,卻偏偏與公主長得像跌捆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子象颖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容