c++快速读入(快读)
C++快读
·
有时候数据采用cin,scanf读入都很慢,导致超时,这时候需要采用更快的读入方法。
快速读入的原理
读入字符比读入数字快,而读取字符使用getchar()
函数。使用getchar之前,要包含头文件cstdio
补充:
getchar()是C语言中的函数,C++中也包含了该函数。getchar()函数只能接收一个字符,其函数值就是从输入设备获取到的字符。getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1。
函数int read()
就是把字符转换成数字k=0;k=k*10+c-'0';
这里可以优化
k = (k << 1) + (k << 3) + (c ^ 48);
位运算左移,移动一位相当于十进制乘2,移动3位相当于十进制乘
2
3
=
8
2^3=8
23=8
所以(k<<1)+(k<<3)
相当于乘10,而c^48相当于c-'0'.
核心代码
while(c >= '0' && c <= '9') {
k = k * 10 + c - '0';//字符转换成为数字
c = getchar();//一位一位读入数字
}
代码
如果全部是正数,读入即可
int read() {
int f = 1, k = 0;//f是正负号,k用来将字符转换成数字
char c = getchar();//读入一个字符
//非数字
while(c < '0' || c > '9'){//读到空格后
c = getchar();//读入空格等。
}
//数字
while( c >= '0' && c<= '9'){
k =k * 10 + c - '0';
c = getchar();//一位一位读入数字
}
return f * k;
}
如果含有负数需要这样
int read() {
int f = 1, k = 0;
char c = getchar();//读入一个字符
//非数字
while(c < '0' || c > '9'){//读到空格后
if(c == '-') //读到负数
f = -1;//保留负号
c = getchar();//两个功能:读取负号后面的数字或者读入空格等。
}
//数字
while(c >= '0' && c <= '9'){
k=k * 10 + c - '0';
c = getchar();//一位一位读入数字
}
return f * k;
}
使用时
数组举例
for(int i = 0; i < n; i++){
a[i] = read();//a数组保存读入的数据
}
点对举例
struct node{
int x,y;
}a[100][2];
for(int i = 0; i < n; i++){
a[i]->x = read();
a[i]->y = read();
}
更多推荐
所有评论(0)