I/O(英语:Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出,在算法竞赛里面一般指的就是控制台(那个黑窗口)里面的输入与输出,平时我们或许并不会因输入输出的速度而烦恼,但在算法竞赛里面对海量的输入数据时,为了程序运行不超时,快速输入算法和快速输出算法就显得尤为重要了!
【此文章只用 C/C++ 语言实现】
std::cin < scanf < getchar
getchar 是最快的,其速度大约为 cin 的 10 倍,然后是 scanf,最后是 cin,原因也很简单,
cin 需要判断输入数据的类型,智能地输入数据,其中,智能识别需要消耗大量时间;(较慢)
scanf 虽不需要智能识别,可它有一个格式化的过程,要识别格式化字符串,需要消耗部分时间;(一般)
getchar 没有什么特殊的过程,直接接收一个字符,几乎不消耗时间;(较快)
因此我们的快速输入算法就是基于 getchar 实现的
函数所需头文件
【C】stdio.h、ctype.h
【C++】iostream
#define int long long //精度提高方法
- inline void getint(int &n)//快速输入整数函数
- //n:引用的变量
- {
- bool b=false;//负号判断变量
- char c=getchar();
- while(isspace(c))c=getchar();//空格字符直接跳过
- if(c==45)b=true,c=getchar();//添加负号标记
- if(isdigit(c))n=0;//初始化为 0
- while(true)
- {
- if(isdigit(c))//判断是否为数字字符
- {
- n*=10;
- n+=c-48;
- c=getchar();
- }
- else break;
- }
- n=b?-n:n;//改变符号
- }
函数所需头文件
【C】stdio.h、ctype.h
【C++】iostream
#define float double //精度提高方法
- inline void getfloat(float &n)//快速输入浮点数函数(兼容整数)
- //n:引用的变量
- {
- float f=1.;//小数
- bool b=false,p=false;//负号判断变量、小数点判断变量
- char c=getchar();
- while(isspace(c))c=getchar();//空格字符直接跳过
- if(c==45)b=true,c=getchar();//添加负号标记
- if(isdigit(c))n=0.;//初始化为 0
- while(true)
- {
- if(!p&&c==46)p=true,c=getchar();//小数点存在
- if(isdigit(c))//判断是否为数字字符
- {
- (!p)?n*=10:f*=10;
- n+=float(c-48)/f;
- c=getchar();
- }
- else break;
- }
- n=b?-n:n;//改变符号
- }
std::cout < printf < putchar
putchar 是最快的,其速度大约为 cout 的 10 倍,然后是 printf,最后是 cout,原因也很简单,
cout 需要判断输出数据的类型,智能地输出数据,其中,智能识别需要消耗大量时间;(较慢)
printf 虽不需要智能识别,可它有一个格式化的过程,要识别格式化字符串,需要消耗部分时间;(一般)
putchar 没有什么特殊的过程,直接输出一个字符,几乎不消耗时间;(较快)
因此我们的快速输出算法就是基于 putchar 实现的
函数所需头文件
【C】stdio.h
【C++】iostream
#define int long long //精度提高方法
- inline void putint(int &n)//快速输出整数函数
- //n:引用的变量
- {
- int num=0;
- if(n<0)putchar(45);//输出负号
- n=n<0?-n:n;//取正数
- while(n)//翻转数字 n
- {
- num*=10;
- num+=n%10;
- n/=10;
- }
- while(num)//输出
- {
- putchar(48+num%10);
- num/=10;
- }
- }
函数所需头文件
【C】stdio.h、math.h
【C++】iostream、cmath
#define float double //精度提高方法
- inline void putfloat(float &n,int p)//快速输出浮点数函数
- //n:引用的变量 p:保留小数点的位数
- {
- long long num=0,key;
- if(n<0)putchar(45);//输出负号
- n=n<0?-n:n;//取正数
- key=n*pow(10,p);//小数部分化为整数
- n=0;//归为 0,便于后续使用
- while(key)//翻转数字 n
- {
- num*=10;
- num+=key%10;
- key/=10;
- n++;
- }
- while(num)//输出
- {
- if(p+key++==n)putchar(46);
- putchar(48+num%10);
- num/=10;
- }
- }
【都看到这里了,点个赞再走呗!】