PAT B1054 求平均值 (20 分)(测试点0、1、2、3分析)

在这里插入图片描述
很恶心的字符串模拟题,主要是测试点很恶心。
测试点0:样例的情况,样例能过这个就能过
测试点1:除数是0的情况,特判输出
测试点2:除数是单数,输出“The average of 1 number is Y”,注意number后面没有s!!!
测试点3:最恶心的一个测试点,因为把形如“123.”,小数点在最后一位的数也算作合法数了,题目并没有明确说明,我一直以为小数点在最后也是非法的,找了好久TvT

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>

using namespace std;

bool isclegal(char c){
    
    
	if(!(c>='0'&&c<='9') && c!='-' && c!='.') return false;
	return true;
}

bool isslegal(string s){
    
    
	int dian = 0;
	int pd;
	bool havenum = false;
	for(int i=0; i<s.size(); i++){
    
    
		if(!isclegal(s[i])){
    
    
			return false;
		}else{
    
    
			if(s[i] == '-'){
    
    
				if(i != 0) return false;
			}
			if(s[i] == '.'){
    
    
				if(i==0) return false;
				pd = i;
				dian++;
			} 
			if(dian > 1) return false;
			if(s[i]<='9' && s[i]>='0') havenum = true;
		}
	}
	if(!havenum) return false;
	if(dian == 1){
    
    
		int len = s.size() - pd - 1;
		if(len > 2) return false;
	}
	double d = stof(s);
	if(d<-1000 || d>1000) return false;
	
	return true;
}

int main(){
    
    
	int n;
	double sum = 0;
	int num = 0;
	scanf("%d", &n);
	
	string str[n];
	for(int i=0; i<n; i++){
    
    
		cin >> str[i];
		if(isslegal(str[i])){
    
    
			sum += stof(str[i]);
			num++;
		}else{
    
    
			printf("ERROR: %s is not a legal number\n", str[i].c_str());		
		}
	}
	if(num == 0){
    
    
		printf("The average of 0 numbers is Undefined");
	}else if(num == 1){
    
    
		printf("The average of 1 number is %.2f", num, sum/(num*1.0));
	}else{
    
    
		printf("The average of %d numbers is %.2f", num, sum/(num*1.0));
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45964844/article/details/113681652