您的位置:首页 > 编程语言 > C语言/C++

◆程序笔记◆◇第三期◇ 读入优化

2017-10-05 16:53 176 查看

Lucky_Glass的程序笔记

第三期-读入优化

C++给我们提供了各种各样的读入方法,常见的有 scanf (标准输入)和 cin (流输入)。但是有一些可怕的题——输入高达几万组(ヽ(゚Д゚)ノ),cin已经炸了,不过还可以用
ios::sync_with_stdio(false)
——关闭流输入输出与标准输入输出的连接——来拯救一下。这样可以达到标准输入输出的速度,but….还有一些更可怕的题——输入数据超过了十万。就算scanf也会超时。

这样如何解决呢?就需要自己写一个读入优化

一、何为读入优化

读入优化是指利用C++的cstdio库中的getchar()函数来优化整数(或实数)的读入速度。那么读入优化究竟是有多快?如下表:

读入规模(整数)100000100000010000000
读入优化6ms45ms466ms
scanf23ms184ms1650ms
cin(优化)56ms384ms3752ms
根据此表,我们可以得出尽管读入了一千万个整数,但是时间还不达半秒(ヽ( ̄▽ ̄)ノ),是完全不需要担心超时的。

这里介绍一个计算程序运行时间的方法:用到了ctime里的clock()函数,它返回的是当前的时间。具体的方法是——在你想开始计时的位置,定义一个double的变量t1,初值为clock(),在计时完毕处也定义一个这样的变量t2,则 t2-t1就得到了运行时间,以毫秒为单位

二、 读入优化函数

一般来说,我们习惯把读入优化函数定义为read()。它的返回类型按照读入类型转换。getchar() 是读入一个字符,速度非常快,那么我们就可以把读入数据抽象成一个字符串,则每次读入其中的一个字符,最后的结果的绝对值存在一个变量x中。由于我们只读入整数,数据中无法避免的会有一些间隔字符,在读入之前,我们用一个while循环读入这些字符,直到读入到数字。但是处理负数的话还需要在开头找到’-‘号,所以当读入到负号时,将标记变量f改为1。接下来就只读入数字,当数字读完时退出,每读入一个数字g,则把x改为 x*10+g,也就是将之前读入的数提前,再将个位补为读入的g。最后判断标记变量f,若为true,则返回 -1*x,否则直接返回x。注意读入的数据大小,避免溢出

三、 看看代码吧!

//读入正整数优化
int read()
{
char ch;ch=getchar();int x=0;
while(ch<'0' || ch>'9') ch=getchar();
while('0'<=ch && ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}


The End

Thanks for reading!

-Lucky_Glass
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息