有时候数据采用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();
		
	}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐