震惊!某精神小伙竟写出double快读?

· · 个人记录

在上上上上期(快读与快写)那一期,我们实现了int快读快写。

那么,double可以不可以呢?答案当然是可以的。

具体思路如下:

小数 = 整数 + 纯小数
所以把整数和纯小数分别输入并组合即可
整数快读之前已经有过了
纯小数只需要稍微改上亿改
那么代码就有了
而double的快写则因为位数不确定
需要给一个打多少位的参数

代码:

double read()
{
    int zh = 0, w = 1;
    double xi = 0.0, x = 1.0;
    char ch = getchar();
    bool flag = false;
    while (ch < '0' || ch > '9')
    {
        if (ch == '-') w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        zh = zh * 10 + ch - '0';
        ch = getchar();
    }
    while (ch < '0' || ch > '9')
    {
        if (ch == '.') flag = true;
        ch = getchar();
    }
    if (!flag) return zh * w;
    while (ch >= '0' && ch <= '9')
    {
        x *= 10;
        xi = xi + (ch - '0') / x;
        ch = getchar();
    }
    if (w == 1) return zh + xi;
    else return zh - xi;
}
void write(long long t)
{
    if (t == 0)
    {
        putchar('0');
        return;
    }
    long long tmp = t > 0 ? t : -t;
    char F[200];
    int cnt = 0;
    while (tmp > 0)
    {
        F[cnt++] = tmp % 10 + '0';
        tmp /= 10;
    }
    while (cnt > 0)
    {
        putchar(F[--cnt]);
    }
}
void write(double d, int k)
{
    int n = pow(10, k);
    double abs = d > 0 ? d : -d;
    if (d == 0)
    {
        putchar('0');
        putchar('.');
        putchar('0');
        return ;
    }
    if (d < 0)
    {
        putchar('-');
    }
    long long zh = (long long) d;//整数部分
    long long xi = (long long)(d * n) % n;//小数部分
    write(zh);
    putchar('.');
    write(xi);
}

技术不怎么高级,稍微理解理解就行了。

另附一首double快读打油诗:

茫茫字海找负号
找到就把它设置
然后跳过下一个
整数部分已开始
前挪一位加数字
加完之后下一个
开始寻找小数点
如果有就设置好
如果没有返整数
开始了小数部分
后移一位好添加
往后加一个数位
加完之后下一个
如果是正把加返
如果是负把减还

如果上面那首诗会背了,double快读也就会了。[doge]

可以试着把每一句话注释到double快读里qwq

答案见于:我的另一篇double快读文章,位于CSDN