快速输入算法
【内置函数速度比较】
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; } }