C++/C语言通用快速输入输出(快读快写)

文章介绍了在处理大量数据时,如何使用自定义的快速读写函数(如整数、浮点数、字符串的快速输入和输出)来避免时间限制。此外,还介绍了超级快读快写模式,通过大缓冲区和高效数据传输提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在编写代码的时候、做信息题目的时候,如果输入输出的数据量比较大的话,经常一不小心就TLE(Time Limit Exceeded,即速度超限,时间超时,通俗的来说就是爆时间),这种情况下就需要scanf和printf,但是万一这两个家伙也不够用了咋办?那么就该是我们的快读快写闪亮登场啦!

普通快读

上定义

这可以使得代码更加具有可读性

#define f_Getchar() getchar()
#define f_Putchar(ch) putchar(ch)

f_Getchar()   即快速(fast)获取字符

f_Putchar()   即快速输出字符

至于为什么要这样做后面再说 

整数输入

int快读

inline void inputI(int* i){
    char nagative = 0 ;
    char ch = '\0' ;
    (*i) = 0 ;
    while((ch = f_Getchar()) < 48 || ch > 57)if(ch == '-')nagative = 1 ;
    while(ch > 47 && ch < 58){
        (*i) = ((*i) << 1) + ((*i) << 3) + (ch & 0xCF) ;
        ch = f_Getchar() ;
    }
    if(nagative)(*i) = -(*i) ;
    return ;
}

简单介绍原理:首先获取字符,如果是非数字,则一直获取直到获取到数字,如果有负号则标记。接着获取一段连续的数字字符,转换为数字。

long long快读

inline void inputLL(long long* i){
    char nagative = 0 ;
    char ch = '\0' ;
    (*i) = 0 ;
    while((ch = f_Getchar()) < 48 || ch > 57)if(ch == '-')nagative = 1 ;
    while(ch > 47 && ch < 58){
        (*i) = ((*i) << 1) + ((*i) << 3) + (ch & 0xCF) ;
        ch = f_Getchar() ;
    }
    if(nagative)(*i) = -(*i) ;
    return ;
}

原理同上 

 long long快读(无参数,返回数值)

inline long long inget(){
    long long i = 0 ;
    char nagative = 0 ;
    char ch = '\0' ;
    while((ch = f_Getchar()) < 48 || ch > 57)if(ch == '-')nagative = 1 ;
    while(ch > 47 && ch < 58){
        i = (i << 1) + (i << 3) + (ch & 0xCF) ;
        ch = f_Getchar() ;
    }
    if(nagative)i = -i ;
    return i ;
}

原理同上 

浮点数输入

float 快读

inline void inputF(float* t){
    (*t) = inget() ;
    float t2 = 0.0F,p = 0.1 ;
    char ch = f_Getchar() ;
    while(ch > 47 && ch < 58 && p > 1e-6F){
        t2 += (ch ^ '0') * p ;
        p *= 0.1 ;
        ch = f_Getchar() ;
    }
    *t += t2 ;
    return ;
}

原理:获取两端分开的连续数字字符,前面一段作为整数部分,后面一段作为小数部分。

double 快读

inline void inputD(double* t){
    *t = inget() ;
    double t2 = 0.0,p = 0.1 ;
    char ch = f_Getchar() ;
    while(ch > 47 && ch < 58 && p >
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值