【最优解法】1054 求平均值 (20分)_31行代码AC
立志用更少的代码做更高效的表达
Pat乙级最优化代码+题解+分析汇总——>传送门
本题的基本要求非常简单:给定 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
我的解法
按字符串输入, 设想出所有可能的特殊样例判断,如果没有则输出即可。以下情况为不合格。
- 如果小数点出现了一次以上
- 如果负号出现了一次以上
- 如果既不是负号也不是小数点还不在0-9的范围内
- 如果长度为1且仅有小数点
- 如果长度为1且仅有负号
- 如果以上条件都符合,则证明他是个数字, 接下来判断是否在区间之外 和 小数点后是否超过两位
- 如果以上情况都没有,那么累加。 输出。
注意:第4点和第5点非常容易忽略。
敲完代码后没有信心, 不断的调试极限样例,最后一发过,还是很开心的哈哈哈哈哈哈。 没有白刷这么多天的题。
下面是大哥的解法, 主要利用了函数功能简化操作。
大哥的解法
采用sscanf将字符串A转化为浮点型变量。 再用sprintf将浮点型变量保存小数点后两位,转化为字符串B。 比较A和B在A的长度下是否相等, 如果不相等,则证明它不合法。
如果合法, 再判断是否在[-1000,+1000]的区间内, 如果满足,则保存,不满足,则不合法。
我的代码
#include<bits/stdc++.h>
using namespace std;
int main() {// while(1) {int n; cin>>n;double sum = 0; //和int numb = 0; //符合的数量 for(int i = 0; i < n; i++) {string s; cin>>s;bool fu = false, dian = false;bool flag = false;int len = s.length(); for(int i = 0; i < len; i++) {if(s[i] == '.' && dian == false) { //如果是第一个小数点,则开始下次循环 dian = true; continue;} else if(s[i] == '-' && fu == false) { //如果是第一个负号,则开始下次循环 fu = true; continue;}if(s[i] == '.' && dian == true) flag = true; //1、如果小数点出现了一次以上,则不合格 else if(s[i] == '-' && fu == true) flag = true; //2、如果负号出现了一次以上,则不合格 else if(s[i] != '.' && s[i] != '-' && (s[i] <'0' || s[i] >'9') ) flag = true; //3、如果既不是负号也不是小数点还不是0-9,则不合格 }if(s[0] == '.') flag = true; //4、特殊情况判断if(s == "-") flag = true; //5、特殊情况判断if(s[0]=='-' && s[1]=='.') flag = true; //如果以上条件都符合,则证明它是一个数字,下面筛选不合格的数字 stringstream ss(s); double x;ss >> x; if(x > 1000 || x < -1000) flag = true; //6、在区间之外,不合格 int find1 = s.find('.');if(find1 != s.npos) {string s1 = s.substr(find1+1);if(s1.length() > 2) flag = true; //7、小数点后超过两位, 不合格} if(flag == false) { //如果以上情况皆无,则赋值 stringstream ss(s);double x;ss >> x; sum += x;numb++;} else cout << "ERROR: " << s << " is not a legal number" << '\n';} if(numb == 0) cout << "The average of 0 numbers is Undefined" << '\n';else if(numb == 1) printf("The average of 1 number is %.2f", sum);else printf("The average of %d numbers is %.2f", numb, sum/(numb*1.0));// } return 0;
}
大哥的代码
#include<bits/stdc++.h>
using namespace std;
int main() {int n; cin>>n;double sum = 0; int numb = 0; //总和和合法 for(int i = 0; i < n; i++) {bool flag = false;char a[105], b[105];cin >> a;double x;sscanf(a, "%lf", &x);sprintf(b, "%.2lf", x);for(int i = 0; i < strlen(a); i++) {if(a[i] != b[i]) { //如果不相等 flag = true; break; }}if(flag==false && (x < -1000 || x > 1000)) flag = true;if(flag == true) printf("ERROR: %s is not a legal number\n", a);else {sum += x; numb++;}}if(numb == 0) printf("The average of 0 numbers is Undefined\n");else if(numb == 1) printf("The average of 1 number is %.2lf\n", sum);else printf("The average of %d numbers is %.2lf\n", numb, sum/numb);return 0;
}
耗时
每日一句
每一个不曾起舞的日子,都是对生命的辜负。
【最优解法】1054 求平均值 (20分)_31行代码AC相关推荐
- 【简便解法】1079 延迟的回文数 (20分)_31行代码AC
立志用更少的代码做更高效的表达 PAT乙级最优解+分析汇总-->传送门 给定一个 k+1 位的正整数 N,写成 ak-a1a0的形式,其中对所有 i 有 0≤ai<10 且 ak ...
- PTA 1054 求平均值 (20 分)
文章目录 code1 18分 code2 20分 注意点 code1 18分 #include<iostream> #include<string.h> using names ...
- 1081 Rational Sum (20 分)_22行代码AC
立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Given N rational numbers in the form numerator/denominator, you a ...
- (最优解)L1-028 判断素数 (10分)——17行代码AC
立志用更少的代码做更高效的表达 本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2 31 的需要判断的正整 ...
- 【PAT乙级】1054 求平均值 (20 分)
题目地址 测试点 2:k==1 number没有s 测试点 3:12. 这种是合法的 #include<cstdio> #include<iostream> #include& ...
- 【最优解法】1087 有多少不同的值 (20分)_17行代码AC
立志用最少的代码做最高效的表达 PAT乙级最优题解-->传送门 当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函 ...
- 最优解法——7-3 将数组中的数逆序存放 (20 分)——10行代码AC
励志用尽量少的代码做高效的表达. 题目描述 本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素. 输入格式: 输入在第一行中给出一个正整数n(1≤n≤1 ...
- 1054 The Dominant Color (20 分)_12行代码AC
立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Behind the scenes in the computer's memory, color is always talke ...
- 1073 多选题常见计分法 (20 分)_66行代码AC
立志用最少的代码做最高效的表达 PAT乙级最优题解-->传送门 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项, ...
最新文章
- 如何正确应用推荐系统!
- centos 7 java安装路径_Linux CentOS 7.0中java安装与配置环境变量的步骤详解
- mysql手工注入imformation_网络安全系列之十八 MySQL基本操作(PHP注入基础)
- [shell基础]——uniq命令
- GCC(-pg) profile mcount | ftrace基础原理
- 一步一步写算法(之挑选最大的n个数)
- Oracle和SQL server的数据类型比较
- 安卓模拟定位mockLocation,闪退?
- 2022最新版VMware虚拟机及CentOS-7安装教程
- 临时邮箱有什么用,推荐5个临时邮箱
- model.load_state_dict(state_dict, strict=False)
- 无线传输时间同步 (基于NRF52设备)
- 关于GCC属性中的弱符号(weak symbol)
- Python入门习题大全——数字 8
- LQA: Time of day is written with a “dot” not a “colon” (13.14 not 13:14)
- mysql -u root mysql_输入命令mysql -u root -p 报错
- 用计算机搞音乐,用电脑键盘做音乐
- Python opencv保存视频打不开
- python脚本windows环境下权限问题处理
- 审稿人意见回复 Response to revierwers (Updating)