昨天晚上写了牛客月赛40,之后第一题叫是说“读入的数据较大,选择比较快的读入方式。”
目录
scanf读入
cin读入相同数据的时间是scanf的3.5~4倍。一般来说,用sacnf读入是要比cin快很多的,要是题目对于时间限制的比较死,就不要犹豫了,毕竟用cin有一定的风险,还是老老实实用sacnf输入。
cin读入
cin读入是比较慢,但是我们可以加上这样一个语句来加快我们读入的速度,(cout和cin一样都还是比较耗费时间的)
std::ios::sync_with_stdio(false); cin.tie(0); //对输入加速 cout.tie(0);//对输出加速
加上这个之后,也是和scanf差不多的。
这里关于scanf和cin的性能比较可以去读一下这个大佬的文章
Read()函数
快速读入函数;先介绍int 类型地。
也就是cin>>a;和这里的a=read();是等价的意思。
int read() { int x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x*f; }
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} 这一句就是读入一段很长的数,之后要判断他是负数;
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); 这里是把字符串转化为数字,再把x*f作为函数的返回值
当然这里讲的是int 类型的快速读入函数,还有 long long类型的,double 类型,string 类型的;
long long 类型的就是数据范围更加大一些像下面这样就可以了//其实就是改了函数类型
long long read() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
string类型的也是类似的,返回类型不一样,返回值也变一下
string StringRead()
{
string str;
char ss = getchar();
while (ss == ' ' || ss == '\n' || ss == '\r')
{
s = getchar();//遇到这些继续往下读;
}
while (s != ' ' && s != '\n' && s != '\r')
{
str += s;
s = getchar();//遇到不是空格,不是换行,不是回车就读入这个字符;
}
return str;
}