立志用更少的代码做更高效的表达


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


我的解法

按字符串输入, 设想出所有可能的特殊样例判断,如果没有则输出即可。以下情况为不合格。

  1. 如果小数点出现了一次以上
  2. 如果负号出现了一次以上
  3. 如果既不是负号也不是小数点还不在0-9的范围内
  4. 如果长度为1且仅有小数点
  5. 如果长度为1且仅有负号
  6. 如果以上条件都符合,则证明他是个数字, 接下来判断是否在区间之外 和 小数点后是否超过两位
  7. 如果以上情况都没有,那么累加。 输出。

注意:第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相关推荐

  1. 【简便解法】1079 延迟的回文数 (20分)_31行代码AC

    立志用更少的代码做更高效的表达 PAT乙级最优解+分析汇总-->传送门 给定一个 k+1 位的正整数 N,写成 ak-a1a0的形式,其中对所有 i 有 0≤a​i<10 且 a​k ​​ ...

  2. PTA 1054 求平均值 (20 分)

    文章目录 code1 18分 code2 20分 注意点 code1 18分 #include<iostream> #include<string.h> using names ...

  3. 1081 Rational Sum (20 分)_22行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Given N rational numbers in the form numerator/denominator, you a ...

  4. (最优解)L1-028 判断素数 (10分)——17行代码AC

    立志用更少的代码做更高效的表达 本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2 ​31 ​​ 的需要判断的正整 ...

  5. 【PAT乙级】1054 求平均值 (20 分)

    题目地址 测试点 2:k==1 number没有s 测试点 3:12. 这种是合法的 #include<cstdio> #include<iostream> #include& ...

  6. 【最优解法】1087 有多少不同的值 (20分)_17行代码AC

    立志用最少的代码做最高效的表达 PAT乙级最优题解-->传送门 当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函 ...

  7. 最优解法——7-3 将数组中的数逆序存放 (20 分)——10行代码AC

    励志用尽量少的代码做高效的表达. 题目描述 本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素. 输入格式: 输入在第一行中给出一个正整数n(1≤n≤1 ...

  8. 1054 The Dominant Color (20 分)_12行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Behind the scenes in the computer's memory, color is always talke ...

  9. 1073 多选题常见计分法 (20 分)_66行代码AC

    立志用最少的代码做最高效的表达 PAT乙级最优题解-->传送门 批改多选题是比较麻烦的事情,有很多不同的计分方法.有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项, ...

最新文章

  1. 如何正确应用推荐系统!
  2. centos 7 java安装路径_Linux CentOS 7.0中java安装与配置环境变量的步骤详解
  3. mysql手工注入imformation_网络安全系列之十八 MySQL基本操作(PHP注入基础)
  4. [shell基础]——uniq命令
  5. GCC(-pg) profile mcount | ftrace基础原理
  6. 一步一步写算法(之挑选最大的n个数)
  7. Oracle和SQL server的数据类型比较
  8. 安卓模拟定位mockLocation,闪退?
  9. 2022最新版VMware虚拟机及CentOS-7安装教程
  10. 临时邮箱有什么用,推荐5个临时邮箱
  11. model.load_state_dict(state_dict, strict=False)
  12. 无线传输时间同步 (基于NRF52设备)
  13. 关于GCC属性中的弱符号(weak symbol)
  14. Python入门习题大全——数字 8
  15. LQA: Time of day is written with a “dot” not a “colon” (13.14 not 13:14)
  16. mysql -u root mysql_输入命令mysql -u root -p 报错
  17. 用计算机搞音乐,用电脑键盘做音乐
  18. Python opencv保存视频打不开
  19. python脚本windows环境下权限问题处理
  20. 审稿人意见回复 Response to revierwers (Updating)

热门文章

  1. 当年我是如何死磕 MySQL 数据库的
  2. 微服务架构统一安全认证设计与实践
  3. Kafka分区分配策略(4)——分配的实施
  4. 5G时代探索互动立体视频信息承载的新可能
  5. 云游戏是大厂的“游戏”之腾讯云云游戏指南
  6. 腾讯云+FFmpeg打造一条完备高效的视频产品链
  7. Hive之DDL数据定义
  8. 企业微信万亿级日志检索系统
  9. 开发一个爆款 VS Code 插件这么简单!
  10. 荣登2019中国“十佳大数据案例”,腾讯大数据再获国家认可