前言

传送门

正文


参考题解

#include<iostream>
#include<string.h>
using namespace std;
/* 题意:计算实数的平均值,值得注意的是有些非法的实数不需要计算在内, 合法实数应该是范围在[-1000,1000],小数点后不超过两位的实数 思路:这题刚开始想了一会儿,首先如何判断该实数是一个非法的实数(因为它 可能是其他什么乱七八糟的字符串,同时对于小数点后两位的要求) ,后面查找发现可以 巧妙地使用sscanf和ssprintf来将保留小数点后两位的该实数输出为一个字符串b,再与 原字符串a进行比较就可以判定是不是非法实数。 */
int n,cnt=0;
char a[100],b[100];
double temp,sum=0.0; 
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		scanf("%s",a);
		sscanf(a,"%lf",&temp);
		sprintf(b,"%.2lf",temp);
		int len=strlen(a);
		bool flag=false;
		//注意len一定是a的长度 
		for(int j=0;j<len;j++){
			if(a[j]!=b[j]){
				flag=true;	
				break; 
			}
		}
		if(flag||temp<-1000||temp>1000){
			printf("ERROR: %s is not a legal number\n",a);
		}else{
			sum+=temp;
			cnt++;	
		}
	}
	//这里要注意当cnt==1时是写sum,不是temp,否则测试点2过不了 
	if(cnt==1)printf("The average of 1 number is %.2lf\n",sum);
	else if(cnt>1)printf("The average of %d numbers is %.2lf\n",cnt,sum/cnt);
	else printf("The average of 0 numbers is Undefined\n");
	return 0;
}