这题的主要难点在于考虑所有非法数字的情况。
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<queue>
#include<string.h>
#include<stack>
#include<string>
#include<math.h>
using namespace std;
const int maxn=1001;
bool islegal(string s){
//+-号,多个小数点,小数点后面位数过多,包含其他字母
int pos=0;
if(s[pos]=='-') pos++;
if(pos==s.length()) return false;//只有一个负号
int cnt=0;//记录小数点的个数
for(int i=pos;i<s.length();i++){
if(s[i]=='.'){
cnt++;
if(cnt>1) return false;
if(s.length()-1-i>2) return false;
}else if(s[i]<'0'||s[i]>'9') return false;
}
double d;
sscanf(s.c_str(),"%lf",&d);
if(d<-1000||d>1000) return false;
return true;
}
int main(){
int n;
cin>>n;
double sum=0;
int cnt=0;
for(int i=0;i<n;i++){
string s;
cin>>s;
if(islegal(s)){
double d;
sscanf(s.c_str(),"%lf",&d);
sum+=d;
cnt++;
}else{
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
}
}
if(cnt==0){
cout<<"The average of 0 numbers is Undefined"<<endl;
}else if(cnt==1){
cout<<"The average of 1 number is "<<fixed<<setprecision(2)<<sum/cnt<<endl;
}else{
cout<<"The average of "<<cnt<<" numbers is "<<fixed<<setprecision(2)<<sum/cnt<<endl;
}
return 0;
}