题目内容
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的时候遇到这道题,编译原理里的有限状态自动机
本题的状态转换图:
num表示数字
‘-’表示负号
‘.’表示小数点
other表示除以上三种的其它字符
any表示任意字符
圆圈里的数字表示状态,初态为0,6为不合法的状态,一旦到达该状态立刻认定此数不合法;2、3(以3状态结束表示小数点后面没数字,经测试本题认定是合法的)、4、5是合法终态;如果在状态1结束是非法的,因为只有一个负号。
源代码:
#include<bits/stdc++.h>
using namespace std;
/*
状态转移矩阵
num - . other
0 2 1 6 6
1 2 6 6 6
2 2 6 3 6
3 4 6 6 6
4 5 6 6 6
5 6 6 6 6
*/
int mx[6][4] = {2,1,6,6,
2,6,6,6,
2,6,3,6,
4,1,6,6,
5,6,6,6,
6,6,6,6};
int mp(char c) //将字符映射为列索引
{
if(c >= '0' && c <= '9') return 0;
if(c == '-') return 1;
if(c == '.') return 2;
return 3;
}
double n;
bool is_legal(string s)
{
int cur_state = 0; //初态为0
for(int i = 0;i < s.size();i ++)
{
char c = s[i];
cur_state = mx[cur_state][mp(c)]; //状态转移
if(cur_state == 6) return false;
}
if(cur_state == 1) return false;
else
{
stringstream stream; //字符串转数字
stream<<s;
stream>>n;
if(n >= -1000 && n <= 1000) return true;
else return false;
}
}
int main()
{
int N,count = 0;
double sum = 0;
cin>>N;
string s;
for(int i = 0;i < N;i ++)
{
cin>>s;
if(is_legal(s))
{
sum += n;
count ++;
}
else cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
}
if(count == 0) cout<<"The average of 0 numbers is Undefined";
else if(count == 1) printf("The average of 1 number is %.2f",sum);
else printf("The average of %d numbers is %.2f",count,sum / count);
return 0;
}