题目


解法1

点击查看代码
#include <iostream>
#include <vector>
using namespace std;

// 检查字符串是否是合法数字
bool isLegal(const string& s) {
    int len = s.length();
    bool hasDot = false;
    int dotPos = -1;

    // 允许负号但必须在首位
    int start = (s[0] == '-') ? 1 : 0;
    if (start == len) return false; // 只有一个 '-',非法

    for (int i = start; i < len; i++) {
        if (s[i] == '.') {
            if (hasDot) return false; // 不能有多个小数点
            hasDot = true;
            dotPos = i;
        } else if (s[i] < '0' || s[i] > '9') {
            return false; // 只能包含数字或单个小数点
        }
    }

    // 小数点后不能超过两位
    if (hasDot && (len - dotPos - 1 > 2)) return false;

    // 转换为数值范围检查
    double value = stod(s);
    if (value < -1000 || value > 1000) return false;

    return true;
}

int main() {
    int n;
    cin >> n;

    vector<double> validNumbers;
    string input;

    for (int i = 0; i < n; i++) {
        cin >> input;
        if (isLegal(input)) {
            validNumbers.push_back(stod(input)); // 转换为 double
        } else {
            cout << "ERROR: " << input << " is not a legal number" << endl;
        }
    }

    // 计算平均值
    int cnt = validNumbers.size();
    if (cnt==0) {
        cout << "The average of 0 numbers is Undefined" << endl;
    } else {
        double sum = 0;
        for (double num : validNumbers) sum += num;
        double avg = sum / validNumbers.size();

        if (cnt == 1) {
            printf("The average of %d number is %.2f",cnt,avg);
        } else {
            printf("The average of %d numbers is %.2f",cnt,avg);
        }
    }

    return 0;
}