c/c++语言开发共享C/C++快读(快速读入)有多快

在一些算法题目中中,有的程序会被卡常(数),就是说,程序虽然渐进复杂度,(通俗来讲:算法的时间复杂度)可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时。这是,快读就显得尤为重要了。 当然,如果程序算法本身就不高效,快读就更加重要了,可以让一些暴力程序获得更多的测试点分数,如果数据 …

在一些算法题目中中,有的程序会被卡常(数),就是说,程序虽然渐进复杂度,(通俗来讲:算法的时间复杂度)可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时。这是,快读就显得尤为重要了。

当然,如果程序算法本身就不高效,快读就更加重要了,可以让一些暴力程序获得更多的测试点分数,如果数据不大甚至能ac,此时快读就是“得分法宝”

快速读入可以让大家的输入更快,这里做了一个测试:快读究竟有多快?(编译器dev-c++ 5.5.3,标准模式(非debug))

 1 #include <cstdio>   2 #include <ctime>   3 #include <iostream>   4 #define loop 2 //循环次数   5 #define data 100000 //数据规模   6 struct dat{   7     int i,s,c;dat(int a=0,int b=0,int k=0){i=a,s=b,c=k;}   8 }dats[100+1];   9 inline int readi(){//快读   10     int x;  11     int fh=1;  12     char a=getchar();  13     while('0'>a || '9'<a){//首先过滤掉非数字字符(注意符号的处理)   14         if(a=='-') fh=-1;  15         a=getchar();  16     }  17     while('0'<=a && a<='9'){//小技巧:x=x*10 可以进位   18         x=x*10+a-'0';  19         a=getchar();  20     }  21     return x*fh;  22 }  23 void tryprint(){  24     file* fp=fopen("in.txt","w");//输出数据   25     for(int i=1;i<=data;++i)fprintf(fp,"%d ",i);  26     fclose(fp);//关闭文件  27     //一定要注意,不关闭文件,数据会写到缓冲区里,可能会丢数据)   28 }  29 void tryreadi(){  30     int t;for(int i=1;i<=data;++i)t=readi();  31 }  32 void tryreads(){  33     int t;for(int i=1;i<=data;++i)scanf("%d",&t);  34 }  35 void tryreadc(){  36     int t;for(int i=1;i<=data;++i)std::cin>>t;   37 }  38 int main(){  39     freopen("out.txt","a",stdout);  40     printf("数据规模:%d 循环次数:%d 单位:msn",data,loop);  41     freopen("in.txt","r",stdin);//读入数据文件(只读)  42     for(int k=1;k<=loop;++k){  43         freopen("out.txt","a",stdout);  44         freopen("in.txt","r",stdin);//读入数据文件(只读)  45         tryprint();clock_t p=clock();  46         tryreadi();clock_t i=clock();  47         tryreads();clock_t s=clock();  48         printf("快读:%un",i-p);  49         printf("scanf输入:%un",s-i);  50         dats[k]=dat(i-p,s-i,0);  51     }  52     double sum=0.0;for(int k=1;k<=loop;++k)sum+=dats[k].i;printf("快读平均:%.0fn",sum/loop);  53     sum=0.0;for(int k=1;k<=loop;++k)sum+=dats[k].s;printf("scanf平均:%.0f",sum/loop);  54     return 0;  55 }

 

快速读入代码:大家可以自己修改,在自己电脑上测试(注意:cin这里我在测试时出现了读入都是零的问题,导致时间过少,求各位大神解决)

测试结果

数据规模:1000000 循环次数:5 单位:ms
快读:50
scanf输入:1113
快读:50
scanf输入:1130
快读:58
scanf输入:1116
快读:52
scanf输入:1168
快读:51
scanf输入:1130
快读平均:52
scanf平均:1131

由此得,快读比scanf快了很多。所以大家在读入较大数据规模时,应尝试快读。

 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/602515.html

(0)
上一篇 2021年5月11日
下一篇 2021年5月11日

精彩推荐