zoukankan      html  css  js  c++  java
  • 1054 求平均值 (20 分)

    输入格式:

    输入第一行给出正整数 N(≤100)。随后一行给出 N 个实数,数字间以一个空格分隔。

    输出格式:

    对每个非法输入,在一行中输出 ERROR: X is not a legal number,其中 X 是输入。最后在一行中输出结果:The average of K numbers is Y,其中 K 是合法输入的个数,Y 是它们的平均值,精确到小数点后 2 位。如果平均值无法计算,则用 Undefined 替换 Y。如果 K 为 1,则输出 The average of 1 number is Y

    输入样例 1:

    7
    5 -3.2 aaa 9999 2.3.4 7.123 2.35
    

    输出样例 1:

    ERROR: aaa is not a legal number
    ERROR: 9999 is not a legal number
    ERROR: 2.3.4 is not a legal number
    ERROR: 7.123 is not a legal number
    The average of 3 numbers is 1.38
    

    输入样例 2:

    2
    aaa -9999
    

    输出样例 2:

    ERROR: aaa is not a legal number
    ERROR: -9999 is not a legal number
    The average of 0 numbers is Undefined
    

     感觉本题的情况复杂较多,容易遗漏,样例的给出给我们提供了几种不合法的情况。但我最初的想法是找合法的,只要是判定是不是合法,就可以将不合法的输出,但是问题在于我找不到一种可以判定合法的方式,然后就去网上浏览了一下,发现网上也没有这种思路的解法,只好放弃,而且几乎都是对每种情况进行分析,除了python的解题代码较为简洁外,其余的c++的解法似乎没有少于50行的。下面是两种比较短的代码

    c++

    #include <stdio.h>
    #include <stdlib.h>
    char a[120];//存储一个合法的数字
    int checkvalid(void)
    {
    	int i=1,point_count=0;
    	if( !(a[0] == '-' || a[0] >='0' && a[0] <= '9' || a[0] == '+' || a[0] =='.')) //第一位非法
    		return 0;
    	if(a[0] == '0')
    	{
    		if( !(a[1] == '.' || a[1] =='')) //第一位为0
    			return 0;
    	}
    	if(a[0] == '.')
    	{
    		if( !(a[1] =='' || a[2] == '') )
    			return 0;
    		point_count ++;
    	}
    	if(a[0] == '-' || a[0] == '+' )  //负数或加了正号的正数的第一位为0
    	{
    		if(a[1] == '0')
    		{
    			if( ! (a[2] == '.' || a[2] == ''))
    				return 0;
    		}
    		if(!(a[1] >='0' && a[1] <='9' || a[1] == '.'))//符号的下一位必须是数字或小数点
    			return 0;
    	}
    	while(a[i] != '')  //第2位开始
    	{
    		if(a[i] =='.')
    		{
    			point_count++;
    			if(point_count == 2) //至多一个小数点
    				return 0;
    			if(   !(a[i-1] <='9' && a[i-1] >= '0' || a[i-1] =='+' || a[i-1] =='-') ) //小数点左必是数字或符号
    				return 0;
    			if( !(a[i+2] == '' || a[i+3] == '') ) //小数点后2至3位必有一个为字符串终点
    				return 0;
    		}
    		if( !(a[i] >='0' && a[i] <='9' || a[i] =='.') ) //必须都是合法的数字或小数点
    			return 0;
    		i++;
    	}
    	if(! (atof(a) <= 1000.00 && atof(a) >=-1000.00) )  //越界
    		return 0;
    	return 1;
    }
    int main()
    {
    	int N,i,count=0;
    	double sum=0;
    	scanf("%d",&N);
    	for(i=0;i<N;i++)
    	{
    		scanf("%s",a);
        if(checkvalid())
        {
    			sum += atof(a);
    			count++;
    		}
    		else
    		{
    			printf("ERROR: %s is not a legal number
    ",a);
    		}
    	}
    	if(count != 0)
    	{
    		if(count != 1)
    			printf("The average of %d numbers is %.2lf
    ",count,sum / count);
    		else
    			printf("The average of 1 number is %.2lf
    ",sum );
    	}
    	else
    		printf("The average of 0 numbers is Undefined
    ");
    }
    

    python

    
    n = int(input())
    a = input().split()
    error = []
    right = []
    for i in a:
        try:
            k = int(i)
            if k<-1000 or k>1000:
                error.append(i)
            else:
                right.append(k)
        except:
            try:
                k = float(i)
                if k<-1000 or k>1000:
                    error.append(i)
                elif len(i)-i.index('.')-1>2:
                    error.append(i)
                else:
                    right.append(k)
            except:
                error.append(i)
    for i in range(len(error)):
        print("%s%s%s"%("ERROR: ",error[i]," is not a legal number"))
    if len(right)==0:
        print("%s%d%s"%("The average of ",len(right)," numbers is Undefined"))
    elif len(right)==1:
        print("%s%d%s%.2f"%("The average of ",len(right)," number is ",right[0]))
    else:
        b = 0
        for i in right:
            b+=i
        b = b/len(right)
        print("%s%d%s%.2f"%("The average of ",len(right)," numbers is ",b,))
    
  • 相关阅读:
    UVA.12096 The SetStack Computer ( 好题 栈 STL混合应用)
    HDOJ(HDU).1412 {A} + {B} (STL SET)
    UVA.10474 Where is the Marble ( 排序 二分查找 )
    HDOJ(HDU).1754 I Hate It (ST 单点替换 区间最大值)
    HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
    17 西安
    17 沈阳
    13 南京
    10/11 作战会议
    2019牛客国庆集训派对day5
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10782124.html
Copyright © 2011-2022 走看看