第01章 ACM基本输入输出
- 格式:ppt
- 大小:474.50 KB
- 文档页数:27
笔试时ACM格式的输⼊输出总结
很多⼤⼚笔试时不是像平时Leecode那样后台写好了输⼊输出,使⽤ACM格式时需要⾃⼰编写输⼊输出。
常⽤的输⼊输出⽅法格式:
scan.next() //读取有效字符串(不论是空格还是回车都会认为是空⽩然后进⾏断点)
scan.nextInt()/scan.nextDouble()/scan.nextByte()//读取有效整型/双精度型/字节型数据类型,以空⽩作为断点
scan.hasNext() //判断是否还有有效字符串
scan.nextLine()//判断是否还有下⼀⾏,以回车视作断点
处理字符串的常⽤⽅法:
可以将读取的字符串s.split(" ")返回⼀个字符串类型数组,将字符串以空格为断点(有时候以,作为断点)将字符串分为字符串数组。
也可以使⽤next()⽅法(仅限于字符串以空格或者回车作为断点时使⽤)挨个读取字符串并将其保存到List中。
javaacm输⼊输出转⾃:下⾯说⼀下ACM-ICPC队员初⽤Java编程所遇到的⼀些问题:1. 基本输⼊输出:(1)JDK 1.5.0 新增的Scanner类为输⼊提供了良好的基础,简直就是为ACM-ICPC⽽设的。
⼀般⽤法为:Codeimport java.io.*import java.util.*public class Main{public static void main(String args[]){Scanner cin = new Scanner(new BufferedInputStream(System.in));}当然也可以直接 Scanner cin = new Scanner(System.in);只是加Buffer可能会快⼀些(2)读⼀个整数: int n = cin.nextInt(); 相当于 scanf("%d", &n); 或 cin >> n;读⼀个字符串:String s = cin.next(); 相当于 scanf("%s", s); 或 cin >> s;读⼀个浮点数:double t = cin.nextDouble(); 相当于 scanf("%lf", &t); 或 cin >> t;读⼀整⾏: String s = cin.nextLine(); 相当于 gets(s); 或 cin.getline(...);判断是否有下⼀个输⼊可以⽤ cin.hasNext() 或 cin.hasNextInt() 或 cin.hasNextDouble() 等,具体见 TOJ 1001 例程。
(3)输出⼀般可以直接⽤ System.out.print() 和 System.out.println(),前者不输出换⾏,⽽后者输出。
⽐如: Code同⼀⾏输出多个整数可以⽤Code也可重新定义:Codestatic PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out));(4)对于输出浮点数保留⼏位⼩数的问题,可以使⽤DecimalFormat类,Codeimport java.text.*;DecimalFormat f = new DecimalFormat("#.00#");DecimalFormat g = new DecimalFormat("0.000");double a = 123.45678, b = 0.12;System.out.println(f.format(a));System.out.println(f.format(b));这⾥0指⼀位数字,#指除0以外的数字。
ACM基本输入输出在开始做ACM时,会面临一个输入输出数据的问题,ACM里的输入输出数据和平时的写程序不大一样。
为什么会不一样呢,这就牵涉到评测系统怎么判断你提交的程序是正确的。
实际上评测系统是把程序的标准输入输出数据都是放在文本文件里,提交的程序会先经过编译,然后运行,从输入文件中读取数据,然后把结果输出到一个文本文件中,评测系统再把标准的输出文件和程序运行结果的输出文件进行对比,从而判断提交的程序的正确与否。
既然是这样,要判断提交的程序的正确性就依赖于系统的测试数据,这时就不可能只是用一组测试数据来判断程序的正确性,需要有很多组测试数据,而国际ACM比赛标准的评测系统是PC2,它只支持一个题目一个输入数据文件、一个输出数据文件。
所以这时候就得把多组测试数据放在一个文件里,提交的程序必须把这个文件里的多组输入数据都得出结果。
一、输入:1、只有一组测试数据,这时候是最简单的了,请看题目SDUTOJ1000。
#include <stdio.h>int main(){int a, b;scanf("%d %d",&a,&b);printf("%d\n",a+b);return 0;}2、有多组测试数据,直到读至输入文件结尾为止,这时需要用到while(scanf("%d",&n)!=EOF),请看题目:SDUTOJ1010。
#include <stdio.h>int main(){int a, b;while(scanf("%d %d",&a, &b) != EOF) // 输入结束时,scanf函数返回值为EOF,则退出while循环printf("%d\n",a+b);return 0;}说明:scanf函数返回值就是读出的变量个数,如:scanf( “%d %d”, &a, &b );如果只有一个整数输入,返回值是1,如果有两个整数输入,返回值是2,如果一个都没有,则返回值是-1。
ACM中常⽤的输⼊输出⽅式 不论是在ACM/ICPC这样类型的⽐赛中,还是在做项⽬中,对于输⼊输出的格式尤为重要,不可以想当然的按⾃⼰那⼀套⾛,我们需要根据题⽬要求进⾏操作,对于第⼀次接触这⽅⾯⽐赛的⼩⽩,最为常见的现象便是类似于下⾯这⾏代码1 printf(“请输⼊⼀组数据:”);2 cout<<"输出的结果为"; 倘若题⽬没有要求你,千万不要有多余的输出,虽然在测试的时候⽅便⾃⼰,但也⿇烦在提交运⾏时注释掉,因为电脑可没有你的⼤脑那样灵活,他要对⽐的数据很死板,多⼀个空格少⼀个空格都不⾏,所以,在这⼀块的处理⼀定要细⼼!细⼼!再细⼼!下⾯我们来看下常见的输⼊输出格式有哪些⼀、基本输⼊输出1、单组输⼊输出已知题⽬有两个变量a和b,现在就要输⼊a和b,操作如下1 //C2 scanf("%d %d",&a,&b); printf("%d %d\n",a,b);3 //C++4 cin>>a>>b; cout<<a<<b<<endl;这个很简单,那么如果题⽬输⼊n组a和b怎么办呢2、n组输⼊输出1 //C2 scanf("%d",&n);3 while(n--) {scanf("%d %d",&a,&b); printf("%d %d\n",a,b);}4 //C++5 cin>>n;6 while(n--){cin>>a>>b;cout<<a<<b<<endl;}也没有那么难嘛,现在如果n不告诉你,要求输⼊多组a和b该如何操作呢?3、多组输⼊输出(重点来了)1 //C2 while(scanf("%d %d",&a,&b)!=EOF){printf("%d %d\n",a,b);}//第⼀种写法3 while(scanf("%d %d",&a,&b)==2){printf("%d %d\n",a,b);}//第⼆种写法4 while(~scanf("%d %d",&a,&b)){printf("%d %d\n",a,b);}//第三种写法5 //C++6 while(cin>>a>>b){cout<<a<<b<<"\n";}竞赛中经常采⽤这种输⼊输出⽅式。