PAT Advanced 1108 Finding Average

Overview

PAT Advanced 1108 Finding Average is a simple problem, just be careful about illegal number cases and follow the legal number definition to calculate the average over legal numbers.

PAT Advenced 1108 Finding Average Problem

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:

7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
Sample Output 1:
ERROR: aaa is not a legal number
ERROR: 9999 is not a legal number
ERROR: 2.3.4 is not a legal number
ERROR: 7.123 is not a legal number
The average of 3 numbers is 1.38

Sample Input 2:

2
aaa -9999
Sample Output 2:
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined

PAT Advenced 1108 Finding Average Algorithm

Follow the legal number definition to calculate the average over legal numbers. And be careful to keep the following THREE things in mind, then you should be able to AC:

  1. A “legal” input is accurate up to no more than 2 decimal places
  2. A “legal” input is a real number in [-1000, 1000]
  3. When there is only ONE legal number, the out put should be “the average of 1 number” the word number should not be followed by s.

The following C++ code is accepted by PAT OJ to solve this 1108 Finding Average problem:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <string>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stdexcept>

using std::cin;
using std::cout;
using std::string;

int main() {
	int n;
	cin >> n;

	int validCount = 0;
	double sum = 0;
	double numericalValue;
	string stringValue;
	for (int i = 0; i < n; ++i) {
		cin >> stringValue;
		std::size_t found = stringValue.find(".");
		if (found != std::string::npos && stringValue.length() - found - 1 > 2) {
			cout << "ERROR: " << stringValue << " is not a legal number" << std::endl;
		} else {
			try {
				numericalValue = std::stod(stringValue);
				if (numericalValue <= 1000 && numericalValue >= -1000) {
					sum += numericalValue;
					++validCount;
				} else {
					cout << "ERROR: " << stringValue << " is not a legal number" << std::endl;
				}
			} catch (const std::invalid_argument &e) {
				cout << "ERROR: " << stringValue << " is not a legal number" << std::endl;
			}
		}
	}

	if (validCount < 1) {
		printf("The average of %d numbers is Undefined\n", validCount);
	} else if (validCount == 1) {
		printf("The average of 1 number is %.2f\n", sum);
	} else {
		printf("The average of %d numbers is %.2f\n", validCount, sum / validCount);
	}
	return 0;
}

Summary

PAT Advanced 1108 Finding Average could be solved easily, just be careful about illegal number cases and follow the legal number definition to calculate the average over legal numbers.

Written on September 16, 2016