c++ - C++ 中的快速输入/输出

标签 c++ c

我需要在一道编程题中输入1到10000范围内的大量数字。题目建议使用快速I/O方法。

我查看了Fast input/output in competitive programming但它太复杂了。那么有人可以告诉我一种更简单的方法来获得快速 io 吗?

另外,请告诉我使用 gets 然后执行 atoi() 是否比使用 scanf(%d) 更快输入。

最佳答案

为了回答你问题的第二部分,对我来说,atoi 的速度大约是它的两倍。考虑以下因素:

#define ITERS 1000000

clock_t testAtoi()
{
    char buffer[64];
    clock_t start = clock();

    for (int i = 0; i < ITERS; i++) {
        sprintf(buffer, "%i", i);
        int l = atoi(buffer);
    }

    return clock() - start;
}

clock_t testScanf()
{
    char buffer[64];
    clock_t start = clock();

    for (int i = 0; i < ITERS; i++) {
        sprintf(buffer, "%i", i);
        int l = 0;
        sscanf(buffer, "%i", &l);
    }

    return clock() - start;
}

int main()
{
    printf("clocks for atoi: %lu\n", testAtoi());
    printf("clocks for sscanf: %lu\n", testScanf());

    return 0;
}

对我来说,使用 gcc 和 -O0 (所以我的变量没有被优化),程序输出:

clocks for atoi: 222011
clocks for sscanf: 392409

但是,如果您使用 FILE *,那么 fscanf 可能会更快。我现在没有时间比较两者,但对于原始字符串,我大部分情况下都会使用 atoi

关于c++ - C++ 中的快速输入/输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10762967/

相关文章:

c++ - C++ std::hash 实现总是确定性的吗?

c - 位域在 union 中未按预期工作

c - unix域套接字编程

java - 在套接字编程中,我在服务器端接收字符串时出错,该字符串的代码是用 c 编写的

c++ - 包含 malloc 声明的头文件的名称是什么?

c++ - 真正的基础类(class)不会建立

c++ - 在 FreeBSD 系统中按进程检索内存使用情况

c++ - 为什么不能推导嵌套在模板类中的枚举的模板参数?

c - 使用 fork() 创建新进程时写时复制优化的优点

c - C 中的字数统计有错误