PAT (Basic Level) 1054 求平均值

题意

给一个数组,求合法数据平均值。

思路

在不知道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 ! ! !

发布了71 篇原创文章 · 获赞 15 · 访问量 3251

猜你喜欢

转载自blog.csdn.net/abcdefbrhdb/article/details/104623443