专栏:PAT乙级刷题笔记
题目
本题的基本要求非常简单:给定 N N N 个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位。当你计算平均值的时候,不能把那些非法的数据算在内。
输入格式
输入第一行给出正整数 N ( ≤ 100 ) N(≤100) N(≤100)。随后一行给出 N 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。
输入样例
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
输出样例
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
分析
要考虑的情况挺多的
测试一下‘-’、‘9.a’、’-1000.1‘这样的数据,若是能过应该就没啥问题了。
注意K=1时,number没有s。。。。这个错误找了老半天
代码
#include<iostream>
using namespace std;
bool PAT(string s){
int i,j;
for(int i = 0;s[i];++i)
if(!(('0' <= s[i] && s[i] <= '9') || s[i] == '.' || (s[i] == '-' && s[i+1])))
return false;
for(i = 0;s[i] && s[i]!='.';++i);
if(!(-1000 <= stof(s) && stof(s) <= 1000))return false;
if(s[i] != '.')
return true;
for(j = i;s[j];++j);
return (j-i) > 3 ? false:true;
}
int main(){
int N,count = 0;
double sum = 0;
cin>>N;
string s;
for(int i = 0;i < N;++i){
cin>>s;
if(!PAT(s))
cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
else{
sum += stof(s);
++count;
}
}
if(!count)
cout<<"The average of 0 numbers is Undefined";
else{
cout<<"The average of "<<count;
if(count == 1)cout<<" number is ";
else cout<<" numbers is ";
printf("%.2f",sum/count);
}
return 0;
}