星星之火OIer:快读&&快输

本文深入解析了快读快输算法,一种用于快速输入输出整数的高效算法。通过利用C语言特性如inline关键字和函数优化技巧,该算法能够显著提高程序运行效率。文章提供了详细的代码实现和注释,帮助读者理解算法原理及应用。
摘要由CSDN通过智能技术生成

快读快输的含义

在这里给大家介绍一下快读快输,自己也存个档。。。。。。

inline void read(int &x) {//开实参,要使读入的值在里面发生变化
    x=0;                  //如果对实参不了解的可以改为int类型的,最后return也可以
    int f=1;//这个是用来判断正负的标志
    char s=getchar();//读入每一个空行、空格和数字
    while(s<'0'||s>'9') {//读入空格和换行阶段
        if(s=='-')//表明这个数是负数
            f=-1;
        s=getchar();//重复读入知道TA是数字
    }
    while(s>='0'&&s<='9') {//读入数字阶段
        x=x*10+s-48;//计算x的值,'0'的ASCII码值是48,剩下的自己想
        s=getchar();//重复读入直到TA读完
    }
    x*=f;//正数不改变符号(x*1),负数就改变(x*-1)
}//此之谓快读
inline void pr(int x) {
    if(x<0) {//负数
        putchar('-');//要先输出负号
        x=-x;//然后就以正数情况输出,这个可以放到pr外面判断,可以节省一丢丢时间
    }
    if(x>9)//因为putchar一次只能输出一位,而且要从前往后输出,所以要用递归输出
        pr(x/10);//递归输出
    putchar(x%10+48);//作为字符输出
}//此之谓快输

这里的inline可以节省函数调用的时间,但建议递归是不要用,有可能会爆

还有一个更快的

#include <cctype>
inline int getc() {
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}//fread才是最快的
   
inline int read() {
    int x = 0; 
    bool f = false;
    char s = getc();
    while(!isdigit(s)) {
        if(s == '-') f = true;
        s = getc();
    }
    while(isdigit(s))
        x = x * 10 + s - 48, s = getc();
    return f ? -x : x;
}

总的再来一个可以copy的:

inline void read(int &x) {
    x=0;
    int f=1;
    char s=getchar();
    while(s<'0'||s>'9') {
        if(s=='-')
            f=-1;
        s=getchar();
    }
    while(s>='0'&&s<='9') {
        x=x*10+s-48;
        s=getchar();
    }
    x*=f;
}
inline void pr(int x) {
    if(x<0) {
        putchar('-');
        x=-x;
    }
    if(x>9)
        pr(x/10);
    putchar(x%10+48);
}

或者:

#include <cctype>
inline int getc() {
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;
}
inline int read() {
    int x=0; 
    bool f=false;
    char s=getc();
    while(!isdigit(s)) {
        if(s=='-') f=true;
        s=getc();
    }
    while(isdigit(s))
        x=x*10+s-48,s=getc();
    return f?-x:x;
}
inline void pr(int x) {
    if(x<0)
        putchar('-');
    if(x>9)
        pr(x/10);
    putchar(x%10+48);
}

还有一个,纯属个人测试,(好像)register不会缩时间(吧)

会缩时间        不会缩时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值