【PAT Basic Level】1054 求平均值


专栏:PAT乙级刷题笔记

题目

本题的基本要求非常简单:给定 N N N 个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位。当你计算平均值的时候,不能把那些非法的数据算在内。

输入格式

输入第一行给出正整数 N ( ≤ 100 ) N(≤100) N100。随后一行给出 N N N 个实数,数字间以一个空格分隔。

输出格式

对每个非法输入,在一行中输出 ERROR: X is not a legal number,其中 X 是输入。最后在一行中输出结果:The average of K numbers is Y,其中 K 是合法输入的个数,Y 是它们的平均值,精确到小数点后 2 位。如果平均值无法计算,则用 Undefined 替换 Y。如果 K 为 1,则输出 The average of 1 number is Y。

输入样例

7
5 -3.2 aaa 9999 2.3.4 7.123 2.35

输出样例

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

分析

要考虑的情况挺多的
测试一下‘-’、‘9.a’、’-1000.1‘这样的数据,若是能过应该就没啥问题了。
注意K=1时,number没有s。。。。这个错误找了老半天

代码

#include<iostream>
using namespace std;

bool PAT(string s){
	int i,j;
	for(int i = 0;s[i];++i)
		if(!(('0' <= s[i] && s[i] <= '9') || s[i] == '.' || (s[i] == '-' && s[i+1])))
			return false;
	for(i = 0;s[i] && s[i]!='.';++i);
	if(!(-1000 <= stof(s) && stof(s) <= 1000))return false;
	if(s[i] != '.')
		return true;
	for(j = i;s[j];++j);
	return (j-i) > 3 ? false:true; 
}

int main(){
	int N,count = 0;
	double sum = 0;
	cin>>N;
	string s;
	for(int i = 0;i < N;++i){
		cin>>s;
		if(!PAT(s))
			cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
		else{
			sum += stof(s);
			++count;
		}
	}
	if(!count)
		cout<<"The average of 0 numbers is Undefined";
	else{
		cout<<"The average of "<<count;
        if(count == 1)cout<<" number is ";
        else cout<<" numbers is ";
		printf("%.2f",sum/count);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值