原题
解析
这道题是有点坑的。
一开始我测试点2一直过不了,然后就一直追加对数字的判断条件,结果最后发现居然是The average of 1 number is Y
没有s,而The average of 0 numbers is Undefined
又是有s的…= =
在测试过程中也想出了很多之前没想到的特例,我在这里给出一些供大家参考。
常规的有:aaa
,1.999
,1.1.1
等
特殊一点的有:.
,-
,-.
,--
,..
,8-
,.8
,--8
等
特别注意:8.
是可行的!如果把这个判断错了的话,测试点3反而会出错!
我的夭寿代码
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main(){
int n;
cin>>n;
vector<string> v;
for(int i=0;i<n;i++){
string s;
cin>>s;
v.push_back(s);
}
int legal=0;
double sum=0;
for(int i=0;i<n;i++){
int dot=0;
int cnt_minus=0;
int dot_ind=-1;
for(int j=0;j<v[i].size();j++){
if((v[i][j]-'0'>9 || v[i][j]-'0'<0)&&!(v[i][j]=='.'||v[i][j]=='-')){ //出现了非数字
//cout<<v[i]<<" is not a number"<<endl;
dot=999;
break;
}
else{
double t;
stringstream ss;
ss<<v[i];
ss>>t;
if(t>1000 || t<-1000){
dot=999;
}
}
if(v[i][j]=='.'){
dot_ind=j;
dot++;
}
if(v[i][j]=='-'){
cnt_minus++;
}
}
if(dot>1 || cnt_minus>1){
printf("ERROR: %s is not a legal number\n",v[i].c_str());
continue;
}
else if((dot>=1 && v[i].size()==1)||(cnt_minus>=1 && v[i].size()==1)){
printf("ERROR: %s is not a legal number\n",v[i].c_str());
continue;
}
else if(dot==1 && cnt_minus==1 && v[i].size()==2){
printf("ERROR: %s is not a legal number\n",v[i].c_str());
continue;
}
//dot_ind==v[i].size()-1 ||
else if((dot_ind==0&&v[i].size()==1)){
printf("ERROR: %s is not a legal number\n",v[i].c_str());
continue;
}
else if(v[i].size()-dot_ind-1>2 && dot_ind!=-1){
printf("ERROR: %s is not a legal number\n",v[i].c_str());
continue;
}
else{
legal++;
double t;
stringstream ss;
ss<<v[i];
ss>>t;
sum+=t;
//cout<<"sum+="<<t<<endl;
}
}
//cout<<"sum="<<sum<<endl;
if(legal>1){
sum/=legal;
printf("The average of %d numbers is %.2f\n",legal,sum);
}
else if(legal==1){
printf("The average of %d number is %.2f\n",legal,sum);
}
else printf("The average of 0 numbers is Undefined\n");
}
找特例的时候心态炸了,代码写的很烂,见谅。
柳神代码
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int main() {
int n, cnt = 0;
char a[50], b[50];
double temp = 0.0, sum = 0.0;
cin >> n;
for(int i = 0; i < n; i++) {
scanf("%s", a);
sscanf(a, "%lf", &temp);
sprintf(b, "%.2f",temp);
int flag = 0;
for(int j = 0; j < strlen(a); j++)
if(a[j] != b[j]) flag = 1;
if(flag || temp < -1000 || temp > 1000) {
printf("ERROR: %s is not a legal number\n", a);
continue;
} else {
sum += temp;
cnt++;
}
}
if(cnt == 1)
printf("The average of 1 number is %.2f", sum);
else if(cnt > 1)
printf("The average of %d numbers is %.2f", cnt, sum / cnt);
else
printf("The average of 0 numbers is Undefined");
return 0;
}
核心思想是用了sscanf和sprintf,很妙。