算法比赛注意事项

1 ACM中java快速输入输出 

大家都知道,在ACM竞赛中,对程序运行时间有非常严格的要求,所以大部分人喜欢用C/C++,因为C/C++比JAVA快,JAVA容易超时。然而JAVA语言本身也有很多C/C++所没有的优势,为了让我们可爱的JAVA不因为运行时间而被ACMers吐槽,也为了让JAVA在ACM竞赛中发挥它更大的价值,故总结出JAVA高速IO输入输出,下面模板已经过多次测试,各大在线测评网站都支持使用。java的Scanner 比较慢(出了名的了),如果需要输入 \large 10^{5} 数量级的数据并输出同样数量级的数据,使用Scanner和System.out耗时将很可能超过1s

1.1 使用 StreamTokenizer 和 PrintWriter

StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

判断文件结尾: 

相当于Java的 while(scanner.hasNext()),或者C的 while(scanf("%d",&n)!=EOF), StreamTokenizer 类中判断文件结尾使用 while (in.nextToken() != StreamTokenizer.TT_EOF) ,StreamTokenizer.TT_EOF这个是个参数,就是相当于EOF了。

1.2 使用 BufferedReader (推荐上面那种)

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
/**
 * 为了从流中获取标记,可以调用StreamTokenizer的nextToken()方法。
 * 调用nextToken()方法以后
 * 如果标记是字符串,可用 String s=st.sval
 * 如果是整数用 int n=(int) st.nval
 * 如果是浮点数用 int n=st.nval   //st.navl默认解析出的格式是double
 * StreamTokenizer.TT_EOF这是个参数,就是指文件尾,EOF
 */

/* 下面这是IO流包装,可以看不懂,直接套用就好*/
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
 
in.nextToken();//第一个次读取前记得调用  in.nextToken()读下一个标记  nextToken()方法相当于让光标指向下一个位置,记得写
int a = (int) in.nval;/*获取整数*/
out.print(a);
out.flush();//这里如果不刷新,不会输出结果  刷新缓冲区,否则a会留在缓冲区

in.nextToken();
double b = in.nval;//st.navl默认解析出的格式是double
out.print(b);
out.flush();

in.nextToken();
String str = in.sval; /*注意:sval是获取不带空格的字符串,含有空格的字符串貌似无法读取。*/
out.print(str);/*输出语句*/
out.flush();/*刷新输出缓冲区*/
// 用于输入的对象
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
// 用于输出的对象
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
// 必须先调用这个把下一个数据拉进来
in.nextToken();
int n = (int) in.nval; // 然后调用in.nval即可得到拉进来的数据
//如果不知道还有没有下一个数据,可以这么写
while (in.nextToken() != StreamTokenizer.TT_EOF) {
    // 然后在这里重复上述的输入过程,并干一些别的事情
}
//输出
out.println(n);
out.printf("%d ", n);
//不管用上述的哪一种输出,最后记得flush
out.flush();

 参考:https://www.cnblogs.com/likailiche/p/4462062.html


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值