PAT(A) 101-133-1-2016-03-12 A. Finding Average (20)

来源:互联网 发布:拍摄淘宝照片背景图片 编辑:程序博客网 时间:2024/06/06 02:28

A. Finding Average (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

The basic task is simple: given N real numbers, you are supposed to calculate their average. But what makes it complicated is that some of the input numbers might not be legal. A "legal" input is a real number in [-1000, 1000] and is accurate up to no more than 2 decimal places. When you calculate the average, those illegal numbers must not be counted in.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=100). Then N numbers are given in the next line, separated by one space.

Output Specification:

For each illegal input number, print in a line "ERROR: X is not a legal number" where X is the input. Then finally print in a line the result: "The average of K numbers is Y" where K is the number of legal inputs and Y is their average, accurate to 2 decimal places. In case the average cannot be calculated, output "Undefined" instead of Y. In case K is only 1, output "The average of 1 number is Y" instead.

Sample Input 1:
75 -3.2 aaa 9999 2.3.4 7.123 2.35
Sample Output 1:
ERROR: aaa is not a legal numberERROR: 9999 is not a legal numberERROR: 2.3.4 is not a legal numberERROR: 7.123 is not a legal numberThe average of 3 numbers is 1.38
Sample Input 2:
2aaa -9999
Sample Output 2:
ERROR: aaa is not a legal numberERROR: -9999 is not a legal numberThe average of 0 numbers is Undefined



#include <iostream>#include <string>using namespace std;float isLegal(string s){int len = s.length();float result = 0.0, resultLast = 0.0;int flag = 1;string::iterator ite = s.begin();if (*ite == '-'){++ite;flag = -1;}while (ite == s.end() || *ite != '.'){if (ite == s.end())return flag * result;if (*ite >= '0' && *ite <= '9'){float num = *ite - '0';result = result * 10 + num;if (result > 1000)return 0.0;}elsereturn 0.0;++ite;}++ite;int weishu = 0;while (1){if (ite == s.end())return flag * (result + resultLast / pow(10, weishu));if (*ite >= '0' && *ite <= '9'){float num = *ite - '0';resultLast = resultLast * 10 + num;++weishu;if (resultLast > 99)return 0.0;}elsereturn 0.0;++ite;}return flag * (result + resultLast / pow(10, weishu));}int main(){int N, amount = 0;cin >> N;string *p = new string[N];float sum = 0.0, temp;for (int i = 0; i < N; ++i){cin >> p[i];temp = isLegal(p[i]);if (fabs(temp) > 0.001){sum += temp;++amount;}else{cout << "ERROR: " << p[i] << " is not a legal number" << endl;}}cout << "The average of " << amount << " numbers is ";if (amount == 0)cout << "Undefined" << endl;elseprintf("%.2f\n", sum / amount);return 0;}


0 0
原创粉丝点击