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')) //第一位为0
			return 0;
	}
	if(a[0] == '.')
	{
		if( !(a[1] =='\0' || a[2] == '\0') )
			return 0;
		point_count ++;
	}
	if(a[0] == '-' || a[0] == '+' )  //负数或加了正号的正数的第一位为0
	{
		if(a[1] == '0')
		{
			if( ! (a[2] == '.' || a[2] == '\0'))
				return 0;
		}
		if(!(a[1] >='0' && a[1] <='9' || a[1] == '.'))//符号的下一位必须是数字或小数点
			return 0;
	}
	while(a[i] != '\0')  //第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] == '\0' || a[i+3] == '\0') ) //小数点后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\n",a);
		}
	}
	if(count != 0)
	{
		if(count != 1)
			printf("The average of %d numbers is %.2lf\n",count,sum / count);
		else
			printf("The average of 1 number is %.2lf\n",sum );
	}
	else
		printf("The average of 0 numbers is Undefined\n");
}

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,))

猜你喜欢

转载自blog.csdn.net/lbperfect123/article/details/82824090