OJ小技巧——语言标准和输入


做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(); 








你可能感兴趣的:(OJ小技巧——语言标准和输入)