zoukankan      html  css  js  c++  java
  • 1054 求平均值 (string+.c_str() )

    本题的基本要求非常简单:给定 N 个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是 [−] 区间内的实数,并且最多精确到小数点后 2 位。当你计算平均值的时候,不能把那些非法的数据算在内。

    输入格式:

    输入第一行给出正整数 N(≤)。随后一行给出 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.以字符串输入,用函数判断是否合法,合法的再用string.c_str()转过来

    2.如果字符串第一个字符是 '-' 则去掉,接下来的合法字符只剩:0-9,'. '

    3.当遍历到 '. ',如果小数点下标的初值不是-1则判断出两个小数点不合理,返回false

    4.将遍历完后的合理字符串转换为double型,如果值大于1000返回false否则返回true

    #include<string>
    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    bool isok(string s){
        if(s[0]=='-') s.erase(s.begin());//hulue diyige fuhao
        int low=-1,len=s.length();
        if(len==0) return false;
        for(int i=0;i<len;i++){
            if(!(s[i]=='.'||(s[i]>='0'&&s[i]<='9'))) return false;//feifa zifu
            if(s[i]=='.'){
                if(low!=-1) return false;//yijingchuxianguo xiaoshudian
                else low=i;
            }    
        }
        if(low!=-1&&low+3<len) return false;//chaoguoliangweixiaoshu
        double temp;
        sscanf(s.c_str(),"%lf",&temp);//zifuchuan zhuanhuancheng double
        return temp<=1000;
    }
    
    int main(){
        int n,num=0;
        cin>>n;
        double sum=0,temp;
        string input;
        for(int i=0;i<n;i++){
            cin>>input;
            if(isok(input)){
                sscanf(input.c_str(),"%lf",&temp);
                sum+=temp;
                num++;
            }else{
                printf("ERROR: %s is not a legal number
    ",input.c_str());
            }
        }
        if(num==0) printf("The average of 0 numbers is Undefined
    ");
        else if(num==1) printf("The average of 1 number is %.2f
    ",sum);
        else printf("The average of %d numbers is %.2f
    ",num, sum/num);
        return 0;
    }
  • 相关阅读:
    SEO
    Hack写法
    文学漫步
    [BZOJ4565] [Haoi2016] 字符合并
    [bzoj 3123][Sdoi2013]森林
    [UVA 12633] Super Rooks on Chessboard FFT+计数
    [HDU4609] 3-idiots FFT+计数
    [bzoj4554] [Tjoi2016&Heoi2016]游戏
    [bzoj4556] [Tjoi2016&Heoi2016]字符串
    [bzoj4552][Tjoi2016&Heoi2016]排序
  • 原文地址:https://www.cnblogs.com/exciting/p/10352110.html
Copyright © 2011-2022 走看看