题目大意
给定N个输入,这些输入中只有在[-1000,1000]内并且位数在2位以内的数字才是合法的,对于不合法的输入直接输出相关信息,对于合法的数字需要计算平均值并进行输出
算法思路
此题唯一的考点就是判断输入是否合法,对于所有的非数字字符进行如下判断:
- 1、如果该字符为"-"并且出现在第一位,跳过
- 2、如果该字符为小数点,则计算小数点后面的位数,如果大于2,则非法,否则统计小数点出现的次数,出现超过1次,则非法
- 3、对于其他非数字字符均为非法字符。
- 4、如果该数字为实数,如果在$[-1000,1000]$内,直接返回,否则非法,返回-1.
提交结果
AC代码
#include <cstdio>
#include <iostream>
using namespace std;
/*
* 判断输入的字符串是否合法
* 含有非数字字符,超过两个小数点,范围在[-1000,1000]以外的都是非法字符
*/
double isLegal(const string &num){
int decimalCount = 0;// 小数点个数
int n = num.size();
for(int i=0;i<n;++i){
char c = num[i];
if(!(c>='0'&&c<='9')){
if(c=='-'&&i==0){
continue;
}else if(c=='.'){
// 出现小数点
int rest = n-i-1;// 计算小数点后面的位数
if(rest>2){
return -1;
}
++decimalCount;
if(decimalCount>=2){
return -1;
}
}else{
return -1;
}
}
}
// 一定为数字
double x = stof(num);
if(x>=-1000&&x<=1000){
return x;
}else{
return -1;
}
}
int main(){
int N;
scanf("%d",&N);
string in;
int legalNum = 0;// 合法输入个数
double sum = 0;
for(int i=0;i<N;++i){
cin>>in;
double a = isLegal(in);
if(a!=-1){
sum += a;
++legalNum;
}else{
cout<<"ERROR: "<<in<<" is not a legal number"<<endl;
}
}
if(legalNum>1){
printf("The average of %d numbers is %.2f",legalNum,sum/legalNum);
} else if(legalNum==1){
printf("The average of 1 number is %.2f",sum);
} else{
printf("The average of 0 numbers is Undefined");
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。