输入输出问题
关于输入输出,可选择的方法一共有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'