题目链接:1054 求平均值
思路
- string保存每条记录。
- 单独编写判定是否合法的函数,将string记录逐位判定,非法情况共有3种:
- 小数点不止1个或小数点后超过2位。
- 除首位可以出现‘-’,其余位置出现了小数点外的非数字字符。
- 数字超出[-1000,1000]范围。
- 原先使用的double类型存储合法数据,后来改成了把合法数据乘上100,使用int保存,可能精度会有提升,但应该不影响能否AC。
- 注意拼写,尤其是number后面是否有s,对应0的情况是有s的。
代码
#include <iostream>
using namespace std;
//使用整形,故输出合法数字的100倍,失败返回0
int IsLegal(string s,int &num){
int dot = -1,sign=1;
num = 0;
for(int i=0;i<s.length();i++){
//出现第二个小数点或小数点后超过两位
if((dot != -1 || i < s.length()-3) && s[i]=='.') return 0;
//记录小数点后位数
if(s[i]=='.') dot = (int)s.length()-i-1;
//出现非数字情况的判断
else if(s[i]>'9' || s[i]<'0'){
//首位为-,记录符号位
if(i == 0 && s[i] == '-') sign = -1;
else return 0;
}
//正常情况,将数字加到当前数字后
else num = num * 10 + s[i] - '0';
}
//整合符号,小数点信息
num *= sign * 100;
for(int i=0;i<dot;i++) num /= 10;
if(num>100000 || num < -100000) return 0;
return 1;
}
int main(){
int N,K = 0;
int num,sum = 0;
string s;
cin >> N;
for(int i=0;i<N;i++){
cin >> s;
int flag = IsLegal(s, num);
//输入非法数字输出错误信息
if(!flag) printf("ERROR: %s is not a legal number\n",s.c_str());
//合法则纳入总数,合法数++
else{
sum += num;
K++;
}
}
//分3种情况输出{0,1,正常}
if(K == 0) printf("The average of 0 numbers is Undefined\n");
else if(K == 1) printf("The average of 1 number is %.2f\n",sum/100.0/N);
else printf("The average of %d numbers is %.2f\n",K,sum/100.0/K);
return 0;
}