前言
快读快写就是通过一小部分的手动实现(当然要调一些函数),达到快速输入/输出的效果.
快读
思路
通过从头到尾读取字符,记录是否有负号,其余部分用累加器累加(注意不同数位的处理).
代码
template<typename T> inline void read(T &x) { // template的用法详见https://www.jianshu.com/p/31d7e18372e2,里面的typename代表变量类型,如果换作class代表<>里的变量类型,适用于class类(stack,queue等就是这样实现的)
T a = 0, b = 1; // a代表除了前面负号(没有负号就不用除)的值,b代表base(大于-1为1,否则为-1)
char ch; // 输入的字符
while (ch != '-' && (ch < '0' || ch > '9')) { // 特殊处理负号以及非法字符
ch = getchar();
}
if (ch == '-') {
b = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') { // 处理剩余合法字符
a = ((T) a << 3) + ((T) a << 1) + (ch ^ '0');
// 相当于a = a * 10 + ch - '0',位运算的形式更快
ch = getchar();
}
x = a * b; // 不要忘记为原来的变量赋值
}
快写
思路
首先判断负号,有的话直接输出.然后输出每一位(当大于9时,输出x / 10,然后 x /= 10),调用putchar函数,第二个参数c表示后跟的字符,初始值为’\0’(如果不带这个参数的话就不输出).
代码
template<typename T> inline void write(T x, char c = '\0') {
if (x < 0) { // 特殊处理负数情况
putchar('-');
x = -x;
}
if (x > 9) { // 输出每一位(递归)
write(x / 10);
}
putchar(x % 10 + '0'); // 此时x < 10,由于最好不要改变x的值,所以用x % 10
if (c != '\0') { // 如果有这个参数,就输出
putchar(c);
}
}
Goodbye,希望大家有收获吖~