zoukankan      html  css  js  c++  java
  • B1054 求平均值

    本题的基本要求非常简单:给定 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


    参考的大神的链接为https://www.liuchuo.net/archives/617

    最终AC代码为:
    #include <iostream>
    #include <cstdio>
    #include <string.h>
    using namespace std;
    int main() {
        int n, cnt = 0;
        char a[50], b[50];
        double temp, sum = 0.0;
        cin >> n;
        for(int i = 0; i < n; i++) {
            scanf("%s", a);
            //将字符数组a[]中的字符转化成double型变量,存在temp中 
            sscanf(a, "%lf", &temp);
            //将temp中的变量以保留两位小数的方式存在字符数组b[]中 
            sprintf(b, "%.2f", temp);
            int flag = 0;
            //若a[]与b[]完全相等,则说明是合法范围 
            for(int j = 0; j < strlen(a); j++)
                if(a[j] != b[j]){
                    flag = 1;
                    break;
                }
            if(flag || temp < -1000 || temp > 1000) {
                printf("ERROR: %s is not a legal number
    ", a);
            }else{
                sum += temp;
                cnt++;
            }
        }
        if(cnt == 1)
            printf("The average of 1 number is %.2f", sum);
        else if(cnt > 1)
            printf("The average of %d numbers is %.2f", cnt, sum / cnt);
        else
            printf("The average of 0 numbers is Undefined");
        return 0;
    }

    这里的最大难点在于如何刷选出合法的数字。在参考的博客中提供了一对非常实用的工具,sscanf和sprintf这两个函数。具体的功能和作者用可看如下链接:https://www.cnblogs.com/Anker/p/3351168.html

    我在做这道题时,后面两个测试用例一直过不了。有一个比较坑的点,就是cnt==1与cnt>1这两种情况必须分开写,不然测试用例2不能通过(至于为什么?我也不是很清楚)。

    还剩测试用例3未能通过,不知道原因出在哪?个人推测应该是Judge()函数判断有效数字这里出了缺漏。自己的代码如下(留作日后学习用)

    #include <iostream> 
    #include <vector>
    using namespace std;
    
    bool Judge(string s){
        bool flag=true, noPoint=true;
        string str="";
        int i=0;
        if(s[i]=='-'){
            i++;
            if(i==s.size()){
                flag = false;
            }
        }
        for( ; i<s.size(); i++){
            if(s[i]=='.'){
                if(noPoint){
                    noPoint = false;
                    while(str.size()>1&&str[0]=='0'){
                        str.erase(str.begin(), str.begin()+1);
                    }
                    if(str.size()>3 || str.size()==0){
                        flag = false;
                        break;
                    }
                    str = "";
                }else{
                    flag = false;
                    break;
                }
                continue;
            }
            if(s[i]>='0'&&s[i]<='9'){
                str += s[i];
            }else{
                flag = false;
                break;
            }
        }
        if(noPoint){
            if(str.size()>3 && str!="1000"){
                flag = false;
            }
        }else{
            if(str.size()>2){
                flag = false;
            }
        }
        return flag;
    }
    
    double toDouble(string s) {
        double ans=0, temp=0;
        bool flag=false, isPoint=false;
        for(int i=0; i<s.size(); i++){
            if(s[i]=='-'){
                flag = true;
                continue;
            }
            if(s[i]=='.'){
                isPoint = true;
                temp = ans;
                ans = 0;
            }else{
                ans = ans * 10.0 + (s[i] - '0');
            }
        }
        if(isPoint){
            while(ans>=1){
                ans /= 10;
            }
        }
        ans += temp;
        if(flag){
            ans = 0 - ans;
        }
        return ans;
    }
    
    int main(){
        int n;
        string s;
        vector<double> vb;
        scanf("%d", &n);
        while(n--){
            cin>>s;
            getchar();
            if(Judge(s)){
                vb.push_back(toDouble(s));
            }else{
                printf("ERROR: %s is not a legal number
    ", s.c_str());
            }
        }
        if(vb.size()==0){
            printf("The average of 0 numbers is Undefined
    ");
        }else if(vb.size()==1) {
            printf("The average of 1 number is %.2f
    ", vb[0]);
        }else{
            double sum=0;
            int i;
            for(i=0; i<vb.size(); i++){
                sum += vb[i];
            }
            printf("The average of %d numbers is %.2f
    ", i, sum/i);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    简明Python3教程 12.问题解决
    简明Python3教程 11.数据结构
    【SPOJ 694】Distinct Substrings
    【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup
    【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring
    【CF Manthan, Codefest 17 A】Tom Riddle's Diary
    【SPOJ 220】 PHRASES
    【POJ 3261】Milk Patterns
    【POJ 3294】Life Forms
    【POJ 1226】Substrings
  • 原文地址:https://www.cnblogs.com/heyour/p/12236250.html
Copyright © 2011-2022 走看看