关于c++:PAT甲级1108-Finding-Average

4次阅读

共计 1140 个字符,预计需要花费 3 分钟才能阅读完成。

题目粗心

给定 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;
}
正文完
 0