1108 Finding Average
题目大意
输入可能存在非法输入,求合法输入数值的平均值
注意
1、最后的输出要注意,当合法数的个数为0或者大于等于2时,用复数numbers;当只有一个时,用单数number。
2、另一种简单的参考方案时是,遍历找到小数点位置,如果存在小数点位置,并且小数点位置后还存在至少3个字符位,就说明不合法。
3、可以直接用sscanf(str.c_str(),"%lf",&number)直接把字符串转换为浮点数。
4、除了字母,还可能有其他非法字符。
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
int k;
bool islegal(string str,double &num){
int len=str.length();
int dot_num=0,dec_size=0,ifneg=1;
double dec_num=0;
if(str[0]=='-'){
ifneg=-1;
str.erase(str.begin());
len--;
if(len==0)return false;}
for(int i=0;i<len;i++){
//如果是英文字母
if(!((str[i]>='0'&&str[i]<='9')||str[i]=='.')){
return false;
}
//如果有两个及以上的小数点
if(str[i]=='.'){
dot_num++;
if(dot_num>1)return false;
}
//分别计算整数部分和小数部分
if(str[i]>='0'&&str[i]<='9'){
if(dot_num==0){
num*=10;
num+=str[i]-'0';}
if(dot_num==1){
dec_size++;
if(dec_size>2)return false;
dec_num*=10;
dec_num+=str[i]-'0';}
}
}
if(dec_size==1)dec_num/=10;
if(dec_size==2)dec_num/=100;
num+=dec_num;num*=ifneg;
if(num>1000||num<-1000)return false;
return true;
}
int main(void){
double sum;//数字总和
int size;
cin>>k;
//依次输入
for(int j=0;j<k;j++){
string str;
double num=0;
cin>>str;
if(islegal(str,num)){
size++;
sum+=num;}
else{
printf("ERROR: %s is not a legal number\n",str.c_str());}
}
//输出
if(size==0)printf("The average of 0 numbers is Undefined\n");
else if(size==1){printf("The average of 1 number is %.2f\n",sum/size);}
else{printf("The average of %d numbers is %.2f\n",size,sum/size);}
}