zoukankan      html  css  js  c++  java
  • 读入输出优化

    简介

    众所周知,有些毒瘤题会卡时间,便有了此篇文章。

    普通快读板子

    读入整数

    getchar()scanf() 快,putchar()printf() 快。

    namespace io {
    	inline int read() {
    		int x=0,f=1;
    		char c=getchar();
    		while(c<'0'||c>'9') {
    			if(c=='-') {
    				f=-1,c=getchar();
    			}
    		}
    		while(c>='0'&&c<='9') {
    			x=x*10+c-'0',c=getchar();
    		}
    		return x*f;
    	}
    	inline void write(int x) {
    		char buf[40];
    		if(!x) {
    			putchar( '0' );
    			return ;
    		}
    		int tmp=x>0?x:-x;
    		if(x<0) {
    			putchar('-');
    		}
    		int cnt=0 ;
    		while(tmp>0) {
    			buf[cnt++]=tmp%10+'0',tmp/=10;
    		}
    		while(cnt>0) {
    			putchar(buf[--cnt]);
    		}
    	}
    }
    using namespace io;
    

    读入字符串

    原理同上。

    inline string StringRead() {
    	string str;
    	char s=getchar();
    	while(s==' '||s=='
    '||s=='
    ') {
    		s=getchar();
    	}
    	while(s^' '&&s^'
    '&&s^'
    ') {
    		str+=s,s=getchar();
    	}
    	return str;
    }
    

    读入浮点数

    前面处理多余字符和判断负数的方式与 int 相同,只是后面读入数字过程中要改变一下。我们引入两个变量 (n)(k)(m)(n) 存储当前是读整数部分还是小数部分,(k) 表示小数部分的值,(m) 表示小数部分的长度(可省略,但为了方便阅读)。(这样写或许过于复杂?)如果读到小数点,便修改n的值,否则就看 (n) 的值来读入整数或小数。

    最后返回答案时,直接将 (k) 转换为小数,然后加上整数部分,然后再决定是返回负数还是正数。

    inline double DoubleRead() {
    	//double的值可能很大,所以开long long
    	long long s=0,w=1,k=0,n=0,m=0;
    	char ch=getchar();
    	//和int一毛一样有木有
    	while(ch<'0'||ch>'9') {
    		if(ch=='-') {
    			w=-1;
    		}
    		ch=getchar();
    	}
    	while((ch>='0'&&ch<='9')||ch=='.') {
    		//n = 0代表读入整数,= 1代表读入小数
    		if(ch=='.') {
    			n=1;
    		} else if (!n) {
    			s=s*10+ch-'0';
    		} else {
    			k=k*10+ch-'0',m++;
    		}
    		ch=getchar();
    	}
    	return (pow(0.1,m)*k+s)*w;
    }
    

    高级快读板子

    原理:批量读入所有数据,因为硬盘 IO 比内存 IO 慢,所以能卡常。慎用!

    using namespace std;
    namespace IO {
    	char buf[1<<22],out[1<<22],*p1=buf,*p2=buf;
    	int p3=-1,f=0;
    	inline char getchar() {
    		return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;
    	}
    	inline void flush() {
    		fwrite(out,1,p3+1,stdout),p3=-1;
    	}
    	inline void check() {
    		if(p3>(1<<21)) {
    			flush();
    		}
    	}
    	inline void putchar(char a) {
    		out[++p3]=a,check();
    	}
    	inline void put(string s) {
    		int tmp=p3;
    		while (p3-tmp<s.size()) putchar(s[p3-tmp]);
    	}
    	inline char gc() {
    		char c=getchar();
    		while (!c||c=='
    '||c==' ') c=getchar();
    		return c;
    	}
    	inline void getc(char *ch) {
    		char c=getchar();
    		int p=-1;
    		while(!c||c=='
    '||c==' ') {
    			c=getchar();
    		}
    		while(!(!c||c=='
    '||c==' ')) {
    			ch[++p]=c,c=getchar();
    		}
    	}
    }
    

    参考资料

  • 相关阅读:
    聊聊高并发(二十)解析java.util.concurrent各个组件(二) 12个原子变量相关类
    windows curl ssl版本号编译
    扩展MSEG 加入Z字段
    HDU 1565 1569 方格取数(最大点权独立集)
    Codeforces Round #277.5 (Div. 2)
    葡萄城公布新版ActiveReports 9报表控件和报表server
    we标签
    ADO.NET (二)—— ADO和ADO .NET对照
    补:小玩文件2--将文本文件里的全部行加上行号后写到新文件里
    poj3061 Subsequence ,尺取法
  • 原文地址:https://www.cnblogs.com/Sam2007/p/13713560.html
Copyright © 2011-2022 走看看