众所周知,c++自带读入函数cin的速度非常慢,尤其是读入数字时。
而c自带读入函数scanf相对来说就要快一点,但在读取多个大数时还是会显得慢。
这个时候就需要我们手写读入函数了(简称快读)
快读思路:运用较快的读取字符函数getchar将数字读入再进行处理还原。
代码:
long long in(){
char c = getchar();
long long x = 0, f = 1;
for (; c < '0' || c > '9'; c = getchar())
if (c == '-') f = -1;
for (; c >= '0' && c <= '9'; c = getchar())
x = (x << 1) + (x << 3) + (c ^ 48);
return x * f;
}
int x=in();long long y=in();
long long in(long long &x){
char c = getchar();
int f = 1;
for (; c < '0' || c > '9'; c = getchar())
if (c == '-') f = -1;
for (; c >= '0' && c <= '9'; c = getchar())
x = (x << 1) + (x << 3) + (c ^ 48);
x*=f;
}
int x;in(x);long long y;in(y);
一般的OI竞赛中,这种快读就够用了,还有更加高深的读入(如fread)我就不一一赘述了(因为我也不会)
正经内容说完了,接下来就是大家期待的整活内容啦。
- 首先,scanf的读入速度比getchar慢,这是毋庸置疑的。
- 四则运算比位运算慢,这也是毋庸置疑的。
- vector数组常数大,比普通数组访问慢,同样是毋庸置疑的。
- 快速幂做较小乘方运算时甚至没有pow函数快,一样毋庸置疑。
- long long类型数据所占内存较int更大,其速度更慢,还是毋庸置疑的。
那么结合以上5点,我推出了慢读1.0
代码:
#include#define ll long long using namespace std; ll _pow(ll a,ll k) { ll res=1; while(k) { if(k%2)res*=a; k/=2; a*=a; } return res; } ll in() { vector a; ll k=0; char c;scanf("%c",&c); ll x=0; while(c<'0'||c>'9')scanf("%c",&c); while(c>='0'&&c<='9'){a.push_back(c-'0');scanf("%c",&c);k++;} ll tot=k; while(k--) x+=_pow(10,tot-k)*a[k]; return x/10; } int main() { ll n; n=in(); printf("%lld",n); return 0; }
求过。



