码迷,mamicode.com
首页 > 其他好文 > 详细

输入输出优化(黑科技)

时间:2016-06-06 18:26:13      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

正常版,输入输出优化比较正常,无论是scanf/printf/cin/cout都可以混用

用法:int x=gi; pint(x); 类似这样。

#define gc getchar()
int g_i()
{
    int tmp=0; bool fu=0; char s;
    while(s=gc,s!=-&&(s<0||s>9)) ;
    if(s==-) fu=1; else tmp=s-0;
    while(s=gc,s>=0&&s<=9) tmp=tmp*10+s-0;
    if(fu) return -tmp; else return tmp;
}
#define gi g_i()
#define pob
#define pc(x) putchar(x)
namespace ib {char b[100];}
inline void pint(int x)
{
    if(x==0) {pc(48); pc(10); return;}
    if(x<0) {pc(-); x=-x;}
    char *s=ib::b;
    while(x) *(++s)=x%10, x/=10;
    while(s!=ib::b) pc((*(s--))+48);
    pc(10);
}

丧病版,输入优化采用fgets,不能与cin/scanf混用,如果需要读入其他类型可能需要手写。

输出优化的行为有一些奇怪,它会把输出缓存到一定数量之后一起输出,可以用pob把缓存中的字符输出,调试时可能需要注意一下(比如多个询问的题目答案可能会在最后一起输出)

用法也是:int x=gi; pint(x); 如果需要把缓存中的内容输出清空就用pob;

输入输出缓存大小可以用BUFSIZE这个宏来控制。

#define BUFSIZE 300000
namespace fib {char b[BUFSIZE]={},*f=b;}
#define gc ((*fib::f)?(*(fib::f++)):(fgets(fib::b,sizeof(fib::b),stdin)?(fib::f=fib::b,*(fib::f++)):-1))
int g_i()
{
    int tmp=0; bool fu=0; char s;
    while(s=gc,s!=-&&(s<0||s>9)) ;
    if(s==-) fu=1; else tmp=s-0;
    while(s=gc,s>=0&&s<=9) tmp=tmp*10+s-0;
    if(fu) return -tmp; else return tmp;
}
#define gi g_i()
namespace fob {char b[BUFSIZE]={},*f=b,*g=b+BUFSIZE-2;}
#define pob (fwrite(fob::b,sizeof(char),fob::f-fob::b,stdout),fob::f=fob::b,0)
#define pc(x) (*(fob::f++)=(x),(fob::f==fob::g)?pob:0)
struct foce {~foce() {pob; fflush(stdout);}} _foce;
namespace ib {char b[100];}
inline void pint(int x)
{
    if(x==0) {pc(48); pc(10); return;}
    if(x<0) {pc(-); x=-x;}
    char *s=ib::b;
    while(x) *(++s)=x%10, x/=10;
    while(s!=ib::b) pc((*(s--))+48);
    pc(10);
}

在许多oj上都交过,正确性应该没什么问题。

输入输出优化(黑科技)

标签:

原文地址:http://www.cnblogs.com/zzqsblog/p/5564621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!