题目描述
本题的基本要求非常简单:给定 N 个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是[−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位。当你计算平均值的时候,不能把那些非法的数据算在内。
输入格式:
输入第一行给出正整数 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做字符串相关的题目,所以本题用python做。首先判断是否在第一位有负号,有的话flag变量置为-1,对该字符串求切片[1:]。之后以小数点分割字符串,列表长度大于2的就是有两个或两个以上的小数点的输入数据,为非法。列表长度等于2的就是小数,分别判断整数和小数部分是否都是数字后转换为浮点数。列表长度等于1的就是整数,判断是否都是数字后转换为整数。最后求平均,输出结果。
注意点
本题博主代码未AC,但不知道问题出在哪里,记录一哈。
#代码
N = input()
str = input()
li = str.split(' ')
flag = 1
sum = 0;
cc = 0;
for i in li:
if i[0] == '-':
flag = -1
tem = i[1:]
else:
tem = i[:]
tem = tem.split('.')
if len(tem) > 2:
print("ERROR: "+i+" is not a legal number")
elif len(tem) == 2:
if tem[1].isdigit() and tem[0].isdigit() and len(tem[1]) <= 2:
sum += flag * float(tem[0]+'.'+tem[1])
cc += 1
else:
print("ERROR: "+i+" is not a legal number")
elif len(tem) == 1:
if tem[0].isdigit():
if int(tem[0]) <= 1000 and int(tem[0]) >= -1000:
sum += flag * int(tem[0])
cc += 1
else:
print("ERROR: "+i+" is not a legal number")
else:
print("ERROR: "+i+" is not a legal number")
flag = 1
if cc > 0:
print("The average of %d numbers is %.2f" % (cc, sum/cc))
else:
print("The average of 0 numbers is Undefined")