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,))
作者:李斌
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步