热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PAT甲级1001A+BFormat20分

题目简介Calculateabandoutputthesuminstandardformat–thatis,thedigitsmustbeseparatedintogroupso

题目简介

Calculate a+b and output the sum in standard format – that is, the digits must be separated into groups of three by commas (unless there are less than four digits).


输入信息

Each input file contains one test case. Each case contains a pair of integers a and b where ​​ -10^6 <&#61; a,b <&#61; 10^6 The numbers are separated by a space.


输出信息

For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.


输入样例

-1000000 9


输出样例

-999,991


分析

给定两个数a和b&#xff0c;计算他们的和&#xff0c;并每三个添加分隔符&#xff08;在千分位添加分隔符&#xff09;
由于都是在int范围内&#xff0c;所以不用考虑溢出的问题。&#xff08;最大2×10^6&#xff09;

首先有一个最简单的方法&#xff0c;就是掏出Java里面一个非常有用的类——DecimalFormat
&#xff08;PS&#xff1a;在PAT考试里面&#xff0c;对于时间限制要求不高的20分题目&#xff0c;用Java往往可以很快秒杀。只要用好String、BigInteger、DecimalFormat等类&#xff09;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.util.StringTokenizer;public class Main {static final int BUFFER_SIZE &#61; 8192 * 25;static BufferedReader br;static StringTokenizer tokenizer;static void initInput(InputStream in) throws Exception {br &#61; new BufferedReader(new InputStreamReader(in), BUFFER_SIZE);tokenizer &#61; new StringTokenizer("");}static String next() throws Exception {while (!tokenizer.hasMoreTokens()) {tokenizer &#61; new StringTokenizer(br.readLine());}return tokenizer.nextToken();}static int nextInt() throws Exception {return Integer.parseInt(next());}static PrintWriter pw;public static void main(String[] args) throws Exception {initInput(System.in);pw &#61; new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out), BUFFER_SIZE));/*正式代码开始*/int a &#61; nextInt(),b&#61;nextInt();int c &#61; a&#43;b;DecimalFormat df &#61; new DecimalFormat("#,###");//如果要求按四位分割&#xff0c;就改为#,####即可pw.println(df.format(c));/*结束*/pw.flush();}
}

如图&#xff0c;核心代码只有四行。&#xff08;关于为什么IO要这么写的说明附在文后&#xff0c;并会给出一个模版&#xff09;
在这里插入图片描述
不出意料&#xff0c;耗时和内存都很高&#xff0c;这是用Java写PAT的常态&#xff08;Python耗时都比Java强。但是不妨碍好用~过了就行&#xff09;

正常考试我们1分钟拿到分就跑了&#xff0c;但是作为学习阶段应该再认真思考一下到底应该怎么做。
对于一个数 1234567890 &#xff08;求和之后&#xff09;&#xff0c;应该表示为1,234,567,890
如果将这个数转化为字符串&#xff0c;其每一位的字符与下标对应关系如下&#xff1a;
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 0
可以看出&#xff0c;在打印str[0] 、str[3]、str[6]字符之后需要打印一个逗号。
通过观察规律&#xff0c;设下标为i&#xff0c;则满足条件 (i&#43;1)%3&#61;&#61;len%3 时需要打印一个逗号。如果 i 是最后一位&#xff08;即 i&#61;&#61;len-1 &#xff09;不需要打印。如果是负数&#xff0c;跳过即可&#xff0c;同样符合这个规律。
如&#xff1a; -1234567
0 1 2 3 4 5 6 7


  • 1,2 3 4,5 6 7
    在str[1]&#xff0c;str[4]之后打印逗号。
    &#xff08;参考 &#64;柳婼 的思路&#xff09;
    C&#43;&#43;实现如下&#xff1a;

#include
#include
using namespace std;
int main() {int a, b;scanf("%d %d", &a, &b);string s &#61; to_string(a &#43; b);for (int i &#61; 0; i < s.length(); i&#43;&#43;) {printf("%c", s[i]);if (s[i] !&#61; &#39;-&#39; && (i &#43; 1) % 3 &#61;&#61; s.length() % 3 && i !&#61; s.length() - 1)printf(",");}return 0;
}

在这里插入图片描述
&#xff08;这个耗时就是天差地别了。。。&#xff09;


附录-关于PAT考试中效率&#xff08;运行时间的问题&#xff09;

刚开始的三四十道题我也是采用Java答题&#xff0c;但是后面部分题目实在是无法通过。&#xff08;限时300ms以下的题目&#xff0c;用Java通过几乎 不可能&#xff09;&#xff0c;下面对于Java的技巧&#xff0c;也仅仅是在一定程度上改良&#xff0c;如果只是自己学着练练题目&#xff0c;可以用Java写&#xff0c;但是如果是要参加考试&#xff0c;请趁早转行。原因在于&#xff1a;
1、Pat官方解释&#xff0c;呵呵&#xff0c;就这样。
2、PTA的判题系统里Java相关的编译程序已经许久 没有维护&#xff0c;Java虚拟机的启动时间也被算在程序运行时间内。
一、如果采用Java答题
Java属于先编译后解释的语言&#xff0c;虽然由.java编译成.class文件的时间不算在内&#xff0c;但是Java虚拟机启动&#xff08;长达50ms&#43;&#xff09;的时间会被算在里面。如果采用了低效的IO方法&#xff0c;效果会更差。相比而言&#xff0c;纯解释型语言&#xff08;如Python&#xff09;&#xff0c;反倒更快&#xff08;相比较而言&#xff09;。
下面的几个提升运行速度的方法&#xff0c;实际效果依次减弱。


  • 使用C&#43;&#43;改写。
  • 停止使用Scanner读入&#xff0c;改用封装过的Reader类

BufferedReader br &#61; new BufferedReader(new InputStreamReader(System.in)));

Scanner虽然方便好用&#xff0c;但是效率极差&#xff0c;参见
Fast Input for Java
某使用Java打国际acm选手做的实验


  • 使用StringTokenizer代替String.parse&#xff0c;StringTokenizer的效率会比String.parse高好几倍。
  • 在上一条中的链接里也有解释。
  • 停止使用System.in输出&#xff0c;改用封装过的Writer类。

PrintWriter pw &#61; new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

使用BufferedWriter封装转化而来的System.out&#xff0c;可以提高效率&#xff0c;再使用PrintWriter封装&#xff0c;可以方便使用print、printf、println等方法。


  • 所有可以静态化的对象尽量静态化&#xff08;存疑&#xff09;
    这个做法的由来是GC不会检查并回收在静态域中的对象&#xff0c;而减少GC的频率则能一定程度提高运行效率&#xff08;实际上效果非常不明显&#xff0c; 几乎没有&#xff09;
    将不用的对象及时置为null也或许能提高一点效率
  • 修改BufferedReader、BufferedWriter默认的缓冲区大小&#xff08;默认值为8192&#xff0c;我将它增大到原来的25倍&#xff09;&#xff0c;以内存换读取效率。
    这也是为什么要写一行&#xff1a;

static final int BUFFER_SIZE &#61; 8192 * 25;

忘了是在哪里见过一次别人这么写&#xff0c;实际 效果存疑&#xff0c; 可能并无卵用。

综上几条可以得出Java里面最高效的读写模版如下&#xff1a;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;public class Main{static final int BUFFER_SIZE &#61; 8192*25;static BufferedReader br;static StringTokenizer tokenizer;static void initInput(InputStream in) throws Exception {br &#61; new BufferedReader(new InputStreamReader(in), BUFFER_SIZE);tokenizer &#61; new StringTokenizer("");}static String next() throws Exception{while(!tokenizer.hasMoreTokens()) {tokenizer &#61; new StringTokenizer(br.readLine());}return tokenizer.nextToken();}static int nextInt() throws Exception {return Integer.parseInt(next());}static double nextDouble() throws Exception{return Double.parseDouble(next());}static PrintWriter pw;public static void main(String[] args) throws Exception {initInput(System.in);pw &#61; new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out),BUFFER_SIZE));/*在这里插入你的代码*/int i &#61; nextInt(); //读取一个整数String s &#61; next(); //读取一个字符串double d &#61; nextDouble(); //读取一个浮点数pw.flush();}
}

注&#xff1a;StringTokenizer的默认分隔符是空格和换行&#xff0c;如果需要其他方式&#xff0c;还是用next()读取字符串后使用spilt方法比较合适。
二、如果采用C语言答题
改用C&#43;&#43;&#xff0c;没有STL基本上不能活。
三、如果采用C&#43;&#43;答题
C&#43;&#43;没什么好说的&#xff0c;一般来说没有大问题&#xff08;很多时候 &#xff0c;Java需要采用最优化的算法才能过&#xff0c;C&#43;&#43;甚至暴力就行了&#xff09;
只有几点需要注意&#xff1a;


  • 尽量采用scanf和printf来读取或输入&#xff08;有人说cin、cout取消刷新也可&#xff09;&#xff0c;特别是在需要读取大量字符串的时候&#xff0c;scanf的效率提升尤为明显。
  • 善用map、set、unordered_map和unordered_set。一般来说&#xff0c;如果key是int类型都可以用数组代替&#xff0c;key是string类型时候才用map。但是如果数据量超大&#xff0c;就要用到unordered_map。&#xff08;map/set底层是红黑树实现&#xff0c;能保证一定有序性&#xff0c;unordered_map/unordered_set底层是哈希表实现&#xff0c;效率稍高&#xff0c;但建表需要时间&#xff09;
    结论是&#xff1a;
    一般情况下用数组&#xff0c;只需要key不需要value用set/unordered_set
    key为string时用map。
    数据量大&#xff08;用map超时&#xff09;&#xff0c;不需要有序性时使用unordered_map。使用unordered_map时&#xff0c;尽量在初始化时就指定好大小&#xff08;减少哈希表扩容带来的开销&#xff09;
    需要有序性&#xff08;排序&#xff09;时&#xff0c;使用map。&#xff08;后面题目会见到&#xff09;
  • 一些小的点&#xff0c;能用邻接表就不用邻接矩阵&#xff0c;用stringstream拼接字符串而不是重载的运算符等等
  • 使用vector代替普通数组。数组能干的vector都能&#xff0c;而且更方便。

当然了&#xff0c;有的时候图方便可以采用一点低效的方法。反正错了还可以再改&#xff08;PAT考试不罚时&#xff09;&#xff08;逃&#xff09;


推荐阅读
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 本文探讨了如何在iOS开发环境中,特别是在Xcode 6.1中,设置和应用自定义文本样式。我们将详细介绍实现方法,并提供一些实用的技巧。 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
  • 树链问题的优化解法:深度优先搜索与质因数分解
    本文介绍了一种通过深度优先搜索(DFS)和质因数分解来解决最长树链问题的方法。我们通过枚举树链上的最大公约数(GCD),将所有节点按其质因子分类,并计算每个类别的最长链,最终求得全局最长链。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • #print(34or4 ... [详细]
author-avatar
fvcvb_974
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有