PAT (Basic Level) Practice 1054 求平均值

乙级1054
PAT (Basic Level) Practice 1054 求平均值_第1张图片
PAT (Basic Level) Practice 1054 求平均值_第2张图片

注意审题!
其实应该算是一个简单模拟题,重点是审题
当合格数只有1的时候,输出的字符串是number而不是numbers测试点3

因为输入的东西什么都可以有,所以用字符串保存输入的值进行判断
长度没必要考虑,1是因为测试点没有考,主要是不知道000000123.2这种用例符不符合出题人的“心思”
负号、小数点的位置,负号若有肯定是第一位,小数点若有肯定不能跟在负号后面。
我实名恶心测试点4,测试点4是形如123.这种字符串最后一位带小数点而且是合格数!
数值大小,我建议把输入的正确数字转成double后直接和1000比这样简单粗暴
主要被测试点4深深恶心到了 题不难
AC代码:

#include
using namespace std;
void prerror(string temp);
void prerror(string temp){
	printf("ERROR: ");
	cout< vect;
	string temp;
	double num;
	scanf("%d",&N);
	for(int i = 0;i>temp;
		len = temp.length();
		num = 0,pointpos = 0,iserror = 0;
		for(int i = len - 1;i>=0;i--){
//			if(len>8){iserror = 1;	break;}//最长长度应为"-1000.00",len = 8 //实际上可能会有000000000.2这种 虽然测试点里没有 
			if((temp[i]<='9'&&temp[i]>='0')||temp[i]=='.'||temp[i]=='-'){
				if(temp[i]=='.'){
//					cout<<"getpoint\n"<<"pointpos = "<0&&temp[i-1]=='-')){ iserror = 1;	break;}//出现了第二个小数点,小数点在首位,小数点前面是负号 
					if(len-i-1==1)	num = num/10;
					else if(len-i-1==2)	num = num/100;
					else if(len-i-1==0) ;//测试点4 我实名恶心 
					else { iserror = 1;	break;}	//小数位大于2位 
					pointpos = i;
				}
				else if(temp[i]=='-'){
					if(i==0) num = 0 - num;
					else { iserror = 1;	break;}
				}	
				else{
					if(!pointpos)
						num = num + (temp[i]-'0')*(double)pow(10,len-i-1);
					else
						num = num +	(temp[i]-'0')*(double)pow(10,pointpos-i-1);				
				} 
			}else{ iserror = 1;	break;}//非数字,小数点,负号 
		}
		if(iserror||num>1000||num<-1000)	prerror(temp);
		else{
			vect.push_back(num);
		}
	}
	int size = vect.size();
	num = 0;
	if(size==0)	printf("The average of 0 numbers is Undefined\n");
	else if(size==1) printf("The average of 1 number is %.2lf\n",*vect.begin());//测试点3 审题!! 
	else{
		vector::iterator iter;
		for(iter = vect.begin();iter!=vect.end();iter++){
		num += *iter;
		}
		printf("The average of %d numbers is %.2lf\n",size,num/size);
	}
	return 0;
} 

你可能感兴趣的:(模拟题,PAT_乙,PAT_乙级)