输入输出问题

关于输入输出,可选择的方法一共有3种:

1、cin和cout

2、scanf和printf

3、读入/输出优化

这三种方法都有各自的优点,也有相应的瑕疵。其中cin和cout使用起来最为方便简单,但速度较慢,数据规模较大时可能会超时,不过可以通过关闭与stdio的同步来加速。

ios::sync_with_stdio(false);
cin.tie();cout.tie()

加速之后就可以达到甚至超过scanf和printf的速度。

而scanf和printf使用起来也比较方便而且速度较快,但需要掌握部分格式输出符的用法。

在这里简单列举一下:

%d  输入输出十进制整数(%u则是无符号整数)

%o  八进制整数    %x  十六进制整数

%c  输入输出单个字符    %s  输入输出字符串(空格会认为是结束并且不会包含)

%f  用于输入输出单精度浮点数(输出时,默认输出6位小数,且会四舍五入)

此外还有一些常用附加格式:

l用于双精度浮点数等(如%lf,%ld,long long类型不一定是%lld,会与操作系统有关)

输出时,也可以指定输出位数,如%7d,不足会补空格,而%07d,不足则会补0

输出浮点数时,可以指定小数位数,如%.mf,就会强制输出m位小数,不会四舍五入


如果数据规模足够大,cin、cout和scanf、printf都无法满足要求时,就需要用到读入/输出优化了。

读入/输出优化的原理是利用了getchar()/putchar()这两个函数的速度较快,然后对应每一位处理。

即使数据规模不是特别大,读入/输出优化也是可以在某些情况下骗到点分数的。

 

 1 #include <cstdio>
 2 
 3 inline int get_num() { //内联一下,更快
 4     int num = 0, flag = 1;
 5     char c = getchar();
 6     while (c < '0' || c > '9') {
 7         if (c == '-') flag = -1;
 8         c = getchar(); //过滤换行空格等
 9     } //并处理负数
10     while (c >= '0' && c <= '9') {
11         num = num * 10 + c - '0';
12         c = getchar();
13     } //读入每位数字
14     return flag * num;
15 }
16 
17 void put_num(int i) { //先处理负数
18     if (i < 0) putchar('-'), i = -i;
19     if (i > 9) put_num(i / 10);
20     putchar(i % 10 + '0'); //大于9才递归
21 } //不要忘记加上'0'
读入及输出优化

 

posted @ 2017-07-31 09:07  Mr^Kevin  阅读(592)  评论(1编辑  收藏  举报