题目大意:给出N个字符串,从中找出绝对值不超过2000,小数位数2位以内的数字,计算它们的平均值。
主要是判断字符串是否合法以及数字是否合法的问题。① 包含非数字字符和负号、小数点字符的字符串非法。 ② 小数点超过1个的字符串非法。③ 负号不在首位的字符串非法。 ④ 有小数点,并且小数位数超过2位的非法。 ⑤ 绝对值大于1000的数非法。 其中当心第四个条件的判断,如果用 find()函数,要检验返回的是否是 npos,或者检查小数点是否有一个,否则判断小数位数会出错(测试点3)。
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
bool isValid(char c)
{
if((c >= '0' && c <= '9') || c == '.' || c == '-') return true;
return false;
}
bool isLegal(string str)
{
int pointCnt = 0;
for (int i = 0; i < str.size(); ++i)
{
if(!isValid(str[i])) return false;
if(i > 0 && str[i] == '-') return false;
if(str[i] == '.')
{
if(++pointCnt > 1) return false;
}
}
int pointPos = str.find(".");
if(pointCnt == 1 && str.size() - 1 - pointPos > 2) return false;
if(abs(stod(str)) > 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 str;
cin >> str;
if(!isLegal(str)) printf("ERROR: %s is not a legal number\n", str.c_str());
else
{
sum += stod(str);
cnt++;
}
}
if(cnt == 0) printf("The average of 0 numbers is Undefined");
else if(cnt == 1) printf("The average of 1 number is %.2f", sum);
else printf("The average of %d numbers is %.2f", cnt, sum / cnt);
return 0;
}