题意
给一个数组,求合法数据平均值。
思路
在不知道stof的情况下模了不少时间,踩了超级多坑(依稀记得1000.
这种也是合法数字;输出也是有三种版本的),这里给出两份代码。一份是强行模拟的初版,另一份是使用stof的。自行参考。
代码
初版:
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
auto to_double = [](string s) -> double {
int flag = 1, lo = 0;
if (s[0] == '-') flag = -1, lo = 1;
int dot_cnt = 0, dot_pos = -1;
for (int i = lo; i < s.size(); ++i) {
if (isdigit(s[i])) continue;
if (s[i] == '.') {dot_cnt++; dot_pos = i; continue;}
return 2333;
}
if (dot_cnt > 1) return 2333;
if (dot_cnt == 0) {
if (s.size() > 5) return 2333;
int res = stoi(s.substr(lo, s.size() - lo));
if (res > 1000) return 2333;
return flag * res;
}
if (dot_cnt == 1) {
if (s.size() > 7) return 2333;
int z = stoi(s.substr(lo, dot_pos - lo));
if (z > 1000) return 2333;
int xs_len = (int)s.size() - dot_pos - 1;
if (xs_len > 2) return 2333;
if (xs_len == 0) return z;
int xs = stoi(s.substr(dot_pos + 1, xs_len));
int base = 1;
while (xs_len--) {base *= 10;}
if (z + xs * 1.0 / base > 1000) return 2333;
return flag * (z + xs * 1.0 / base);
}
};
double sum = 0;
int cnt = 0;
for (int i = 0; i < n; ++i) {
string s;
cin >> s;
double res = to_double(s);
if (res == 2333) {
cout << "ERROR: " << s << " is not a legal number\n";
continue;
}
sum += res;
cnt++;
}
cout << "The average of " << cnt;
if (cnt == 1)
cout << " number is " << fixed << setprecision(2) << sum << '\n';
else if (cnt == 0)
cout << " numbers is Undefined\n";
else
cout << " numbers is " << fixed << setprecision(2) << sum / cnt << '\n';
return 0;
}
优化版:
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
auto to_db = [](string s) -> double {
const double FFF = 2333;
if (s.size() > 7) return FFF;
if (s.size() == 1 && s[0] == '-') return FFF;
int dot_cnt = 0, dot_pos = -1;
for (int i = (s[0] == '-' ? 1 : 0); i < s.size(); ++i) {
if (isdigit(s[i])) continue;
if (s[i] == '.') {dot_cnt++; dot_pos = i; continue;}
return FFF;
}
if (dot_cnt > 1) return FFF;
if (dot_cnt == 1 && (int)s.size() - dot_pos - 1 > 2) return FFF;
double res = stof(s);
if (fabs(res) > 1000) return FFF;
return res;
};
double sum = 0;
int cnt = 0;
for (int i = 0; i < n; ++i) {
string s;
cin >> s;
double res = to_db(s);
if (res == 2333) {
cout << "ERROR: " << s << " is not a legal number\n";
continue;
}
sum += res;
cnt++;
}
cout << "The average of " << cnt;
if (cnt == 0)
cout << " numbers is Undefined\n";
else if (cnt == 1)
cout << " number is " << fixed << setprecision(2) << sum / cnt<< '\n';
else
cout << " numbers is " << fixed << setprecision(2) << sum / cnt << '\n';
return 0;
}
HINT
不定时更新更多题解,Basic Level 全部AC代码,详见 link ! ! !