注意审题!
其实应该算是一个简单模拟题,重点是审题
当合格数只有1的时候,输出的字符串是number而不是numbers(测试点3)
因为输入的东西什么都可以有,所以用字符串保存输入的值进行判断
长度没必要考虑,1是因为测试点没有考,主要是不知道000000123.2这种用例符不符合出题人的“心思”
负号、小数点的位置,负号若有肯定是第一位,小数点若有肯定不能跟在负号后面。
我实名恶心测试点4,测试点4是形如123.
这种字符串最后一位带小数点而且是合格数!
数值大小,我建议把输入的正确数字转成double后直接和1000比这样简单粗暴
主要被测试点4深深恶心到了 题不难
AC代码:
#include<bits/stdc++.h>
using namespace std;
void prerror(string temp);
void prerror(string temp){
printf("ERROR: ");
cout<<temp;
printf(" is not a legal number\n");
}
int main(){
int N,K=0,len,pointpos,iserror;
vector<double> vect;
string temp;
double num;
scanf("%d",&N);
for(int i = 0;i<N;i++){
cin>>temp;
len = temp.length();
num = 0,pointpos = 0,iserror = 0;
for(int i = len - 1;i>=0;i--){
// if(len>8){iserror = 1; break;}//最长长度应为"-1000.00",len = 8 //实际上可能会有000000000.2这种 虽然测试点里没有
if((temp[i]<='9'&&temp[i]>='0')||temp[i]=='.'||temp[i]=='-'){
if(temp[i]=='.'){
// cout<<"getpoint\n"<<"pointpos = "<<pointpos<<endl;
if(pointpos||i==0||(i>0&&temp[i-1]=='-')){ iserror = 1; break;}//出现了第二个小数点,小数点在首位,小数点前面是负号
if(len-i-1==1) num = num/10;
else if(len-i-1==2) num = num/100;
else if(len-i-1==0) ;//测试点4 我实名恶心
else { iserror = 1; break;} //小数位大于2位
pointpos = i;
}
else if(temp[i]=='-'){
if(i==0) num = 0 - num;
else { iserror = 1; break;}
}
else{
if(!pointpos)
num = num + (temp[i]-'0')*(double)pow(10,len-i-1);
else
num = num + (temp[i]-'0')*(double)pow(10,pointpos-i-1);
}
}else{ iserror = 1; break;}//非数字,小数点,负号
}
if(iserror||num>1000||num<-1000) prerror(temp);
else{
vect.push_back(num);
}
}
int size = vect.size();
num = 0;
if(size==0) printf("The average of 0 numbers is Undefined\n");
else if(size==1) printf("The average of 1 number is %.2lf\n",*vect.begin());//测试点3 审题!!
else{
vector<double>::iterator iter;
for(iter = vect.begin();iter!=vect.end();iter++){
num += *iter;
}
printf("The average of %d numbers is %.2lf\n",size,num/size);
}
return 0;
}