zoukankan      html  css  js  c++  java
  • 1108 Finding Average (20分)

    The basic task is simple: given N real numbers, you are supposed to calculate their average. But what makes it complicated is that some of the input numbers might not be legal. A legal input is a real number in [−] and is accurate up to no more than 2 decimal places. When you calculate the average, those illegal numbers must not be counted in.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives a positive integer N (≤). Then N numbers are given in the next line, separated by one space.

    Output Specification:

    For each illegal input number, print in a line ERROR: X is not a legal number where X is the input. Then finally print in a line the result: The average of K numbers is Y where K is the number of legal inputs and Y is their average, accurate to 2 decimal places. In case the average cannot be calculated, output Undefined instead of Y. In case K is only 1, output The average of 1 number is Y instead.

    Sample Input 1:

    7
    5 -3.2 aaa 9999 2.3.4 7.123 2.35
    
     

    Sample Output 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
    
     

    Sample Input 2:

    2
    aaa -9999
    
     

    Sample Output 2:

    ERROR: aaa is not a legal number
    ERROR: -9999 is not a legal number
    The average of 0 numbers is Undefined

    这题考察如下的自动机,就按照如下的自动机执行即可判断,考察编译原理中识别数字。

    #include <iostream>
    using namespace std;
    int N, cnt = 0; string tmp;
    double sum = 0.0;
    // 自动机解决数字判断
    bool isLegal(string& s) {
        int i = 0;
        if(s[i] == '-') {
            i++; // 第一位是-
            if(i >= s.length() || !isdigit(s[i])) return false; // 第二位不是数字
        }
        while(i < s.length() && isdigit(s[i])) i++; // 过滤掉小数点前数字
        if(i == s.length()) return true; // 结束1
        if(s[i] == '.') i++; // 过滤. 
        int cnt = 2;
        while(cnt--) if(i < s.length() && isdigit(s[i])) i++; // 过滤掉小数点后2位数字
        return i == s.length(); // 如果到了最后,则返回true,否则返回false
    }
    int main() {
        cin >> N;
        while(N--) {
            cin >> tmp;
            if(isLegal(tmp) && stod(tmp) >= -1000 && stod(tmp) <= 1000) {
                cnt++;
                sum += stod(tmp);
            } else printf("ERROR: %s is not a legal number
    ", tmp.c_str());
        }
        if(cnt == 0) printf("The average of 0 numbers is Undefined
    ");
        else if(cnt == 1) printf("The average of 1 number is %.2lf
    ", sum);
        else printf("The average of %d numbers is %.2lf
    ", cnt, sum / (double)cnt);
        return 0;
    }
  • 相关阅读:
    kolla多节点部署openstack
    归并排序
    gitlab ci/cd
    微信、支付宝个人收款码不能用于经营收款 z
    微信小程序弹出和隐藏遮罩层动画以及五星评分
    centos7 安装 nginx
    netty+websocket模式下token身份验证遇到的问题
    windows 截图 win+shift+s
    linux下 "chmod 777" 中777这个数字是怎么出来的
    nginx四层转发,访问内网mysql数据库
  • 原文地址:https://www.cnblogs.com/littlepage/p/12869534.html
Copyright © 2011-2022 走看看