【PAT乙级】1054 求平均值

题目链接:1054 求平均值

思路

  1. string保存每条记录。
  2. 单独编写判定是否合法的函数,将string记录逐位判定,非法情况共有3种:
    1. 小数点不止1个或小数点后超过2位。
    2. 除首位可以出现‘-’,其余位置出现了小数点外的非数字字符。
    3. 数字超出[-1000,1000]范围。
  3. 原先使用的double类型存储合法数据,后来改成了把合法数据乘上100,使用int保存,可能精度会有提升,但应该不影响能否AC。
  4. 注意拼写,尤其是number后面是否有s,对应0的情况是有s的。

代码

#include <iostream>
using namespace std;

//使用整形,故输出合法数字的100倍,失败返回0
int IsLegal(string s,int &num){
    int dot = -1,sign=1;
    num = 0;
    for(int i=0;i<s.length();i++){
        //出现第二个小数点或小数点后超过两位
        if((dot != -1 || i < s.length()-3) && s[i]=='.') return 0;
        //记录小数点后位数
        if(s[i]=='.') dot = (int)s.length()-i-1;
        //出现非数字情况的判断
        else if(s[i]>'9' || s[i]<'0'){
            //首位为-,记录符号位
            if(i == 0 && s[i] == '-') sign = -1;
            else return 0;
        }
        //正常情况,将数字加到当前数字后
        else num = num * 10 + s[i] - '0';
    }
    //整合符号,小数点信息
    num *= sign * 100;
    for(int i=0;i<dot;i++) num /= 10;
    if(num>100000 || num < -100000) return 0;
    return 1;
}

int main(){
    int N,K = 0;
    int num,sum = 0;
    string s;
    cin >> N;
    for(int i=0;i<N;i++){
        cin >> s;
        int flag = IsLegal(s, num);
        //输入非法数字输出错误信息
        if(!flag) printf("ERROR: %s is not a legal number\n",s.c_str());
        //合法则纳入总数,合法数++
        else{
            sum += num;
            K++;
        }
    }
    //分3种情况输出{0,1,正常}
    if(K == 0) printf("The average of 0 numbers is Undefined\n");
    else if(K == 1) printf("The average of 1 number is %.2f\n",sum/100.0/N);
    else printf("The average of %d numbers is %.2f\n",K,sum/100.0/K);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wulingyu501/article/details/108937442
今日推荐