贴几个快读快输

首先得声明……其实有时候快读快输也不比scanf或者printf快多少……
这是某大佬告诉我的,cin大约能支持输入输出100万的点,scanf大约是1000万,快读快输则是1亿,再快的话就用fread……然后还有大佬告诉我……有些题目会特意去卡read……所以各位谨慎使用……
#define C getchar()
inline void read(int &s){
	s=0; int t=1,k=C;
	for (;k<'0'||k>'9';k=C) if (k=='-') t=-1;//判断该数正负 
	for (;k>='0'&&k<='9';k=C) s=(s<<1)+(s<<3)+(k^48);//<<1加上<<3就相当于*10,但是位运算的速度较快,^48也相当于-‘0’,同理,较快。 
	s*=t;
}
#define C getchar()
template <typename T>
inline void read(T &s){
	 T t=1; char k=C; s=0;
	for (;k<'0'||k>'9';k=C) if (k=='-') t=-1;//判断该数正负 
	for (;k>='0'&&k<='9';k=C) s=(s<<1)+(s<<3)+(k^48);//<<1加上<<3就相当于*10,但是位运算的速度较快,^48也相当于-‘0’,同理,较快。 
	s*=t;
}
我也不知道为什么)反正后面的加上了template 的比前面的跑的快一些……,然后贴上老刘的namespace……
namespace INIT{
	char buf[1<<15],*fs,*ft;
	inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
	inline int read(){
		int x=0,f=1;  char ch=getc();
		while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getc();}
		while(isdigit(ch))  {x=x*10+ch-'0';  ch=getc();}
		return x*f;
	}
}using namespace INIT;

那么这些就是快读了……
然后是我自己写的两个快输,一个用递归写的,一个就是循环……


#define G(a) putchar(a+48)
inline void write(int s){
	if (s<0) G(-3),s=-s;
	if (s>9) write(s/10);
	G(s%10);
}

#define G(a) putchar(a+48)
inline void write(int s){
	int t=0,a[40];
	if (s<0) G(-3),s=-s;
	do { a[++t]=s%10; } while (t/=10);//用do while的原因是不用特判一个0
	while(t) G(a[t--]);
	putchar('');//看题目需要,可以加入\n进行换行或者加入空格 
}

看情况使用就好……再重复一遍……请选择合适的输入输出,比如几百个点用read也真是太费时间了吧……
ps:使用方法:比如要输入a,则直接read(a)即可,输出a就write(a)。

猜你喜欢

转载自blog.csdn.net/lbj_0116/article/details/80501922
今日推荐