P1054 求平均值

转跳点:

1054 求平均值 (20分)

本题的基本要求非常简单:给定 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

这道题整体上上还是很简单的,毕竟就是求个平均数。

不过坑的地方就在于小数位的判断两位还是两位以上,这个需要动脑子了,不过如过你会sscanf和sprintf的话就可以很轻易的想到方法。

sscanf() : 从一个字符串中读进与指定格式相符的数据
sprintf():字符串格式化命令,主要功能是把格式化的数据写入某个字符串中

一个%lf读入,一个%。2lf写入,比较一下字符串的差别就好了,而且sscanf不会读入字母,嘿嘿,简直就是神兵利器~

最最最最重要的难点!count == 1 的时候,输出 number 不是 numbers,哭死我了。

AC代码

#include <stdio.h>
#include <stdlib.h> int main(void)
{
char data1[40];
char data2[40];
int n, count = 0;
double temp, sum = 0.0; scanf("%d", &n); for (int i = 0; i < n; i++)
{
scanf("%s", data1);
sscanf(data1, "%lf", &temp);
sprintf(data2, "%.2lf", temp); //合法小数判断
int flag = 1;
for (int j = 0; data1[j] != '\0'; j++)
{
if (data1[j] != data2[j])
{
flag = 0;
break;
}
}
//整数合法性
if (0 == flag || temp < -1000 || temp > 1000)
{
printf("ERROR: %s is not a legal number\n", data1);
continue;
}
sum += temp;
count++;
} if (0 == count)
{
printf("The average of 0 numbers is Undefined");
}
else
{
printf("The average of %d number%s is %.2f", 1 == count ? 1 : count, 1 == count ? "" : "s", 1 == count ? sum : sum / count);
} return 0;
}

写完之后看来一下其他人的博客,发现这个思路也挺不错:

链接:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int main()
{
int count = 0, N;
double f, sum = 0;
/* Maxium scenario: -1000.00. So just need to read 8 chars(+ '\0' = 9) */
char s[9], *pEnd, *pDot, c; scanf("%d", &N);
for(int i = 0; i < N; i++)
{
scanf("%8s", s); /* Just read up to 8 chars */ c = ungetc(getchar(), stdin); /* Read next char and push back */
f = strtod(s, &pEnd); /* pEnd -> converted floating number */
pDot = strchr(s, '.'); /* pDot -> (first) decimal point */ if(!isspace(c) /* string too long */
|| *pEnd /* not floating number */
|| (f > 1000 || f < -1000) /* out of range */
|| (pDot && pDot - s < strlen(s) - 3)) /* precision too high */
{
printf("ERROR: %s", s);
/* this can avoid overflow (we don't know how long input is) */
while(!isspace(c = getchar())) putchar(c);
printf(" is not a legal number\n");
}
else /* legel number */
{
count++;
sum += f;
}
} if(count == 0) printf("The average of 0 numbers is Undefined\n");
if(count == 1) printf("The average of 1 number is %.2lf", sum);
if(count >= 2) printf("The average of %d numbers is %.2lf", count, sum / count); return 0;
}

PTA不易,诸君共勉!

P1054 求平均值的更多相关文章

  1. PAT-乙级-1054. 求平均值 (20)

    1054. 求平均值 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题的基本要求非常简单:给定N个实 ...

  2. excl剔除不合格数据求平均值

    excl剔除不合格数据求平均值 trimmean函数 正态分布: CONFIDENCE.NORM 函数

  3. python 录入姓名和成绩, 并且求平均值

    lst = []while 1: a = input("请输入学生的姓名和成绩(姓名_成绩), 输入Q退出录入:") if a.upper() == "Q": ...

  4. 深度学习原理与框架-图像补全(原理与代码) 1.tf.nn.moments(求平均值和标准差) 2.tf.control_dependencies(先执行内部操作) 3.tf.cond(判别执行前或后函数) 4.tf.nn.atrous_conv2d 5.tf.nn.conv2d_transpose(反卷积) 7.tf.train.get_checkpoint_state(判断sess是否存在

    1. tf.nn.moments(x, axes=[0, 1, 2])  # 对前三个维度求平均值和标准差,结果为最后一个维度,即对每个feature_map求平均值和标准差 参数说明:x为输入的fe ...

  5. JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出

    rs = require("readline-sync"); let arr = []; console.log("请输入数组的长度:"); let arr_l ...

  6. Linux下的计算命令和求和、求平均值、求最值命令梳理

    在Linux系统下,经常会有一些计算需求,那么下面就简单梳理下几个常用到的计算命令 (1)bc命令bc命令是一种支持任意精度的交互执行的计算器语言.bash内置了对整数四则运算的支持,但是并不支持浮点 ...

  7. PAT 乙级 1054 求平均值 (20) C++版

    1054. 求平均值 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题的基本要求非常简单:给定N个实 ...

  8. C# Linq to Entity Lamda方式分组并求和求平均值

    1.单字段分组并求和: var list = data.GroupBy(g => g.GoodsId).Select(e => new { GoodsId = e.Key, Qty = e ...

  9. PAT 1054 求平均值 (20)(代码+思路+测试用例)

    1054 求平均值 (20)(20 分) 本题的基本要求非常简单:给定N个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个"合法"的输入是[-1000,1000]区 ...

随机推荐

  1. git rebase 与git merge 小结

    git merge是用来合并两个分支的. $ git merge b   将b分支合并到当前分支 同样  $ git rebase b ,也是把 b分支合并到当前分支 ---------------- ...

  2. WebVR大潮来袭时,前端开发能做些什么

    WebVR大潮来袭时,前端开发能做些什么?     WebVR即web + VR的体验方式,我们可以戴着头显享受沉浸式的网页,新的API标准让我们可以使用js语言来开发.本文将介绍如何快速开发一个We ...

  3. CMake构建Qt5的VS2015项目 (Hello Qt5)

    Qt5的编译 Windows下载编译Qt5 Gui CMakeLists.txt 源码 cmake_minimum_required(VERSION 2.8.11) project(HelloQt5) ...

  4. ubuntu14 安装Node.js

    @brief ubuntu  安装Node.js @date 2018-06-28 @see Ubuntu 上安装 Node.js(https://www.runoob.com/nodejs/node ...

  5. vb.net自学完整版

    https://m.book118.com/html/2016/1203/67671992.shtm

  6. 记一次关于NVROM中遇到的“Could not prepare Boot variable:No space left on device”问题的解决历程

    注:关于我电脑遇到的问题,不是一两句话能够说清楚的.为了能够比较完整的呈现问题的某些细节,在这篇博客中我会添加许多问题发生的背景,如果当中有观点与您的三观不合,请立即停止阅读,及时止损. 注:此篇文章 ...

  7. 网络协议-dubbo协议

    Dubbo支持dubbo.rmi.hessian.http.webservice.thrift.redis等多种协议,但是Dubbo官网是推荐我们使用Dubbo协议的. 下面我们就针对Dubbo的每种 ...

  8. ADV-302 秘密行动 java

    问题描述 小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面.这座大厦有一个神奇的特点,每层的高度都不一样,同时,小D也拥有一项特殊能力,可以一次向上跳跃一层或两层,但是这项能力无法连续使用 ...

  9. GPU运行Tensorflow的几点建议

    1.在运行之前先查看GPU的使用情况: 指令:nvidia-smi 备注:查看GPU此时的使用情况 或者 指令:watch nvidia-smi 备注:实时返回GPU使用情况 2.指定GPU训练: 方 ...

  10. 《Netlogo多主体建模入门》笔记4

    4- 从Langton的蚂蚁看Turtle与Patch的交互   这只蚂蚁从10000步开始,就会自发地 “建桥”     Turtle与Patch就好比是,一个方块和一个格子的关系. 一个格子上可以 ...