做ACM题最头痛的是什么?对于刚刚与OJ系统过招的新人来说,不管你之前是不是编程达人,OJ的一些输入输出的潜规则都会让你为无尽的OJ报错弄得火大。今天,朕沐浴之后来总结一下。
首先是语言标准。
一些OJ的编译运行环境十分奇葩,根本没有任何说明。
如C、C++用的是GCC4,还是VS的高版本编译器。Java用的jdk版本是什么。(有些OJ只支持jdk1.4,这就很令人抓狂了,这意味着拆箱装箱不能用,Scanner也不能用)。记得某OJ上支持C#程序的提交,我觉得很高兴,因为.Net的版本差异和前后兼容要好得多,我随便写了个简单的题,却发现编译错误,查看OJ的LOG,竟然发现C#的编译环境是Mono!差点没一口老血喷出来。
之后是选择IDE,这个就不多啰嗦了,我倒是很还念当年用VC6.0和Dev-C++的时光。
现在,自己按OJ的情况吧,谁会为了个OJ定制PC里的IDE呢。如,C++的
#<iostream>//GCC4 #<iostream.h>//VC6 #"iostream"//VC2003+ using namespace std;
再来,来点干货,自己也备着。总结一些输入输出的技巧。
读到文件的结尾,程序自动结束
C/C++
while( ( scanf(“%d”, &a) ) != -1 ) while( ( scanf(“%d”, &a) ) != EOF) while( ( scanf(“%d”, &a) ) == 1 ) while( ~( scanf(“%d”, &a) ) )
C++
while( !cin.eof())
Java
Scanner scn = new Scanner (System.in); scn.hasNext()
一些另类情况:
读到一个0时,程序结束
while( scanf(“%d”, &a) , a) while( scanf(“%d”, &a)!=EOF && a)
读到多个0时,程序结束
while( scanf(“%d%d%d”, &a, &b, &c), a+b+c ) //a,b,c非负 while( scanf(“%d%d%d”, &a, &b, &c), a|b|c )
输入问题:(给出了C、C++、Java三种形式)
读一个整数:
scanf("%d", &n);
cin >> n;
int n = sc.nextInt();
读一个字符串:
scanf("%s", s);
cin >> s;
String s = sc.next();
读一个浮点数:
scanf("%lf", &t);
cin >> t;
double t = sc.nextDouble();
读一整行:
gets(s);
cin.getline(...);
String s = sc.nextLine();