原题链接:https://www.patest.cn/contests/pat-a-practise/1108
1108. Finding Average (20)
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.35Sample 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.38Sample Input 2:
2 aaa -9999Sample Output 2:
ERROR: aaa is not a legal number ERROR: -9999 is not a legal number The average of 0 numbers is Undefined
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
using namespace std;
char s[1000];
int main()
{
int n,i,j,flag,cnt,cc=0;
double sum=0.0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
cnt=0;
flag=0;
scanf("%s",s);
int len=strlen(s);
if(s[0]=='-')//注意负号的判断
j=1;
else
j=0;
for(; j<len; j++)
{
if(s[j]=='.')//小数点最多只能是一个
{
if(len-1-j>2)
{
flag=1;
break;
}
cnt++;
if(cnt==2)
{
flag=1;
break;
}
continue;
}
if(s[j]<'0'||s[j]>'9')
{
flag=1;
break;
}
}
if(flag){
printf("ERROR: %s is not a legal number\n",s);
continue;
}
if(s[0]=='-')
j=1;
else
j=0;
flag=0;
double sum1=0,sum2=0;
for(; j<len; j++)
{
if(s[j]=='.')
{
flag=1;
continue;
}
if(flag==0)
sum1=sum1*10+s[j]-'0';
else
sum2=sum2*10+s[j]-'0';
}
if(sum1>1000||(sum1==1000&&sum2!=0)){
printf("ERROR: %s is not a legal number\n",s);
continue;
}
cc++;
while(sum2>=1)
sum2/=10;
double ss=sum1+sum2;
if(s[0]=='-')//注意符号一定要在加完之后判断,不能在判断完符号之后再加,这样数值错误
ss=-ss;
sum+=ss;
}
if(cc==0)
printf("The average of 0 numbers is Undefined\n");
else if(cc==1)
printf("The average of 1 number is %.2f\n",sum);//注意只有一个数字时,输出number而不是numbers(坑点)
else
printf("The average of %d numbers is %.2f\n",cc,sum/cc);
return 0;
}