pat A1108 Finding Average (20分)

1、题目

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

2、主要思想

1、对于每个输入的字符串,从头到尾扫描;
2、对于合法字符,分别记录小数点前后的整数字符个数并将小数点前后的数字字符串,转换为double型数;
3、根据整数和分数部分的数字和位数可以将合法字符转换为double型数;4、将每个合法数字相加并求平均数

3、我的代码

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
double ans=0;
int validNum=0;
bool isValid(string x)
{
	bool flag=false;//该数字是否为负 
	bool flagM=false;//是否已经过小数点 
	int frontNum=0;//记录小数点前的整数个数 
	double front=0;//小数点前的整数 
	int backNum=0;//记录小数点后的整数个数 
	double back=0;//小数点后的整数 
	if(x[0]=='-')
	{
		flag=true; 
		for(int i=1;i<x.length();i++)
		{
			if(x[i]>='0'&&x[i]<='9')
			{
				if(flagM==false)
				{
					frontNum++;
					front=front*10+(x[i]-'0'); 
					if(front>1000)
					{
						return false;
					}
				}
				else
				{
					backNum++;
					back=back*10+(x[i]-'0'); 
				} 
			} 
			else if(x[i]=='.')
			{
				if(front>1000)
				{
					return false;
				}
				flagM=true; 
			}
			else
			{
				return false;
			}
			//注意1000.xx的情况 
			if(flagM&&backNum>2||flagM&&back>0&&front>=1000)
			{
				return false;
			}
		} 
	}
	else
	for(int i=0;i<x.length();i++)
	{
		if(x[i]>='0'&&x[i]<='9')
		{
			if(flagM==false)
			{
				frontNum++;
				front=front*10+(x[i]-'0'); 
			
				if(front>1000)
				{
					return false;
				}
			}
			else
			{
				backNum++;
				back=back*10+(x[i]-'0'); 
			} 
		} 
		//. 只能过一次 
		else if(x[i]=='.'&&flagM==false)
		{
			if(front>1000)
			{
				return false;
			}
			flagM=true; 
		}
		else
		{
			return false;
		}
		if(flagM&&backNum>2||flagM&&back>0&&front>=1000)
		{
			return false;
		}
	} 
	ans+=front;
	for(int i=0;i<backNum;i++)
	{
		back/=10;
	}
	ans+=back; 
	validNum++;
	
	if(flag)
	{
		ans=-ans;
	}
	return true;
}
main()
{
	int n;
	double ave=0;
	string str;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		cin>>str;
		if(!isValid(str))
		{
			cout<<"ERROR: "<<str<<" is not a legal number"<<endl;
		}
		else
		{
			ave+=ans;
			ans=0;
		}
	} 
	if(validNum>1)
	{
		cout<<"The average of "<<validNum<<" numbers is ";
		printf("%.2f",ave/validNum);
	}
	else if(validNum==1)
	{
		cout<<"The average of 1 number is ";
		printf("%.2f",ave);
	}
	else
	{
		cout<<"The average of 0 numbers is Undefined";
	}
}

4、测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值